пользователей: 30398
предметов: 12406
вопросов: 234839
Конспект-online
РЕГИСТРАЦИЯ ЭКСКУРСИЯ

Заготовки запросов. Scope

  1. Заготовки запросов. Scope

Заготовки запросов

Создание заготовки запроса

Заготовки позволяют вам повторно использовать логику запросов в моделях. Для создания заготовки просто начните имя метода со scope:

class User extends Eloquent {



  public function scopePopular($query)

  {

    return $query->where('votes', '>', 100);

  }



  public function scopeWomen($query)

  {

    return $query->whereGender('W');

  }



}

Использование заготовки

$users = User::popular()->women()->orderBy('created_at')->get();

Динамические заготовки

Иногда вам может потребоваться определить заготовку, которая принимает параметры. Для этого просто добавьте эти параметры к методу заготовки:

class User extends Eloquent {



  public function scopeOfType($query, $type)

  {

    return $query->whereType($type);

  }



}

А затем передайте их при вызове метода заготовки:

$users = User::ofType('member')->get();

+ 4.2

добавлено в 4.2 (04.12.2014)

Глобальные заготовки (scopes)

Иногда вам требуется определить заготовку, которая будет применяться для всех выполняемых в модели запросов. По сути так и работает «мягкое удаление» в Eloquent. Глобальные заготовки определяются с помощью комбинации типажей PHP и реализации Illuminate\Database\Eloquent\ScopeInterface.

Сначала определим типаж. В этом примере мы будем использовать встроенный в Laravel SoftDeletingTrait:

trait SoftDeletingTrait {



  /**

   * Загрузка типажа мягкого удаления для модели.

   *

   * @return void

   */

  public static function bootSoftDeletingTrait()

  {

    static::addGlobalScope(new SoftDeletingScope);

  }



}

Если в модели Eloquent используется типаж, содержащий соответствующий соглашению по названиям bootNameOfTrait метод, тогда этот метод типажа будет вызываться при загрузке модели Eloquent. Это даёт вам возможность зарегистрировать глобальную заготовку, или сделать ещё что-либо необходимое. Заготовка должна реализовывать ScopeInterface, который содержит два метода: apply() и remove().

Метод apply() принимает объект конструктора запросов Illuminate\Database\Eloquent\Builder и отвечает за добавление любых дополнительных операторов where, которые необходимы заготовке.
Метод remove() также принимает объект Builder и отвечает за отмену действий, произведённых методом apply(). Другими словами, remove() должен удалить добавленные операторы where (или любые другие).
Поэтому для нашей SoftDeletingScope методы будут такими:

/**

 * Применение заготовки к указанному конструктору запросов Eloquent.

 *

 * @param  \Illuminate\Database\Eloquent\Builder  $builder

 * @return void

 */

public function apply(Builder $builder)

{

  $model = $builder->getModel();



  $builder->whereNull($model->getQualifiedDeletedAtColumn());

}



/**

 * Удаление заготовки из указанного конструктора запросов Eloquent.

 *

 * @param  \Illuminate\Database\Eloquent\Builder  $builder

 * @return void

 */

public function remove(Builder $builder)

{

  $column = $builder->getModel()->getQualifiedDeletedAtColumn();



  $query = $builder->getQuery();



  foreach ((array) $query->wheres as $key => $where)

  {

    // Если оператор where ограничивает мягкое удаление данных, мы удалим его из

    // запроса и сбросим ключи в операторах where. Это позволит разработчику

    // включить удалённую модель в отношения результирующего набора, который загружается "лениво".

    if ($this->isSoftDeleteConstraint($where, $column))

    {

      unset($query->wheres[$key]);



      $query->wheres = array_values($query->wheres);

    }

  }

}

 


22.06.2017; 21:35
хиты: 150
рейтинг:0
для добавления комментариев необходимо авторизироваться.
  Copyright © 2013-2024. All Rights Reserved. помощь