Глобальные области видимости Laravel 5.1 Куда мне обратиться?

Ну, я начал с Laravel всего несколько недель назад, так что извините, если я повторяю что-то очевидное, но... вот в чем дело:

У меня есть несколько областей запросов в модели Photo:

public function scopeSkipFirst($query) 
{
    return $query->where('id', '>', 1);
}

public function scopeSearch($query, $search) 
{
    return $query->where('title', 'LIKE', "%$search%");
}

Теперь я хочу, чтобы первый выполнялся каждый раз, когда я делаю запрос Eloquent по этой модели, как в Photo::all(); и я хочу, чтобы вторая область запроса была доступна для любой другой модели.

Каков наилучший способ сделать это? Оба сценария global scopes? Я прочитал несколько сообщений (например, этот), но у меня нет четкого представления о том, на какую документацию мне следует ссылаться (Laravel 4.2 # Global scopes section; 5.1 Eloquent # Events; ¿?).


person user2744115    schedule 24.09.2015    source источник


Ответы (1)


Если вы хотите, чтобы все ваши модели имели метод scopeSearch(), то имеет смысл переместить его в трейт, а затем применить этот трейт к вашим моделям. Что-то вроде Searchable:

trait Searchable
{
    public function scopeSearch($query, $search) 
    {
        return $query->where($this->getSearchField(), 'LIKE', "%$search%");
    }

    protected function getSearchField()
    {
        return 'title';
    }
}

Я также сделал столбец настраиваемым, так как не все модели могут иметь столбец title. Например, когда я создаю модель Article в своих приложениях, у меня будет столбец headline вместо title.

С приведенным выше трейтом вы можете сделать модель доступной для поиска, реализуя трейт:

class Photo extends Model
{
    use Searchable;
}

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

Метод scopeSkipFirst() можно сделать глобальной областью действия, если вы хотите, чтобы он применялся каждый раз, когда вы запрашиваете свою модель Photo, но я не могу придумать причину, по которой вы хотели бы всегда пропускать определенную запись . Зачем иметь его в базе данных, если вы никогда не хотите его отображать?

person Martin Bean    schedule 24.09.2015
comment
Эй, спасибо! И какую документацию вы бы порекомендовали для глобальных областей видимости в Laravel 5.1? В официальных документах, по крайней мере, у меня возникли проблемы с его поиском... (Забудьте о scopeSkipFirst(); просто тупой метод для проверки/примеров). - person user2744115; 24.09.2015
comment
Я не уверен, почему этот раздел был удален при переписывании документации 5.1, но в версии 5.0 он существует: laravel.com/docs/5.0/eloquent#global-scopes - person Martin Bean; 24.09.2015
comment
Хорошо, здорово! Спасибо еще раз. - person user2744115; 24.09.2015