В Eloquetn ORM есть замечательный функционал scopes
https://laravel.com/docs/5.7/eloquent#query-scopes
Если кратко - это заготовки запросов, позволяют проименовать некое выражение и использовать его потом для расширения других запросов. Причем они могут быть динамическими - принимать на вход какие то параметры, для подстановки в запрос или изменения логики его формирования.
Например, есть у нас несколько разных запросов для получения списка постов но в каждом из этих запросов необходимо ограничить выборку по ряду критериев одинаковых для всех запросов. Скажем, мы принимаем решение отображать или нет пост исходя из нескольких параметров: роль пользователя, автор ли он, в каком статусе пост, когда он был опубликован.
Работая с eloquetn мы просто создадим метод, например scopeVisable() в моделе Post:
public function scopeVisable($query, User $user)
{
...
return $query->where(...);
}
а затем при формировании любого запроса на получение постов сможем использовать эту заготовку при построении запроса:
$posts = Post::visable($user)->get();
Как принято решать такие задачи с доктриной?