Laravel Eloquent как переопределить базовый запрос? - PullRequest
0 голосов
/ 13 декабря 2018

У меня есть две модели с одной и той же таблицей.

Имя таблицы: books , я разделяю обычную книгу и роман по атрибуту type

Книга модель

class Book extends \Illuminate\Database\Eloquent\Model
{
    protected $table = 'books';
}

Роман модель

class Novel extends Book
{
    protected $table = 'books';

    // Is such a method available?
    protected function someMethodToOverride()
    {
        $this->where('type', 'novel');
    }
}

Здесь я хочу достичь

$results = Novel::where('title', 'LIKE', '%' . $title . '%')->get();

из этогозапрос, я хочу предварительно установить условие

where('type', 'novel')

Есть ли какая-либо функция, которую я могу переопределить для достижения этой цели?

Ответы [ 2 ]

0 голосов
/ 13 декабря 2018

используйте Anonymous Global Scopes и добавьте этот метод загрузки в Novel Модель

protected static function boot()
    {
        parent::boot();

        static::addGlobalScope('type', function (\Illuminate\Database\Eloquent\Builder $builder) {
            $builder->where('type', 'novel');
        });
    }

, теперь он автоматически добавит запрос

$results = Novel::where('title', 'LIKE', '%' . $title . '%')->get();

сейчас. Если вы хотитеудалить глобальную область для данного запроса, вы можете использовать метод withoutGlobalScope.

Novel::withoutGlobalScope('type')->get();

для получения дополнительной информации прочитайте эту статью

0 голосов
/ 13 декабря 2018

В модели Вы можете использовать область действия:

public function scopeOfType($query, $type)
{
    return $query->where('type', $type);
}

И передавать параметры при вызове области действия:

 Model::ofType('novel')
        ->where('title', 'LIKE', '%' . $title . '%')
        ->get();

см. Ссылку Область действия Laravel

...