Частично одинаковые запросы в БД Laravel
В приложении есть деление по пользователям. И есть множество крудов, которые должны возвращать данные пользователя. В таблицах есть поле owner_id. Вопрос заключается в том, как можно сделать какой-либо конструктор запроса, чтобы каждый запрос улетал с where('owner_id', $ownerId)? Этот запрос должен улетать с разных моделей Вот несколько примеров:
В TaskRepository есть запрос на получение списка задач:
public function withChildren()
{
return Task::whereNull('parent_id')
->with('tags')
->ownerId($this->userId)
->paginate(5);
}
Также есть шаблон фильтрации:
public function filter(array $data)
{
$filter = app()->make(TaskFilter::class, ['queryParams' => array_filter($data)]);
$tasks = Task::filter($filter)->get();
return $tasks;
}
Вот пример запроса в TaskFilter:
public function priorityId($value)
{
$this->builder->where('priority_id', $value);
}
Такая же ситуация обстоит в модели Category, Tags и т.д. Ко всем запросам нужно добавлять where('owner_id', $ownerId);
Подскажите, как это грамотно сделать
Ответы (1 шт):
Как вариант использовать трейт с локальным скоупом для фильтрации запроса по owner_id в Laravel. Трейт предоставит удобный метод для применения скоупа внутри модели. Вот пример:
trait OwnerScopeTrait
{
public function scopeByOwner($query, $ownerId)
{
return $query->where('owner_id', $ownerId);
}
}
И затем ты можешь использовать этот трейт в своих моделях:
class Tag extends Model
{
use OwnerScopeTrait;
}
Теперь, когда ты хочешь получить записи с определенным owner_id, ты можешь использовать локальный скоуп в своих запросах:
$specificOwnerRecords = YourModel::byOwner(2)->get();