У меня сам был похожий вопрос некоторое время назад, и я нашел странное решение, чтобы избежать блока if / else.
Допущения
Я предположил существование вспомогательного метода вМодель пользователя называется isNot($role)
, чтобы проверить, совпадает ли роль пользователя с данной.Это всего лишь пример, чтобы дать представление о проверке, но вы должны реализовать условие так, как вам нравится.
Второе предположение, которое я сделал, состоит в том, что у каждого заказа есть поле user_id
, которое будет ссылаться на владельца этого чека.закажите его идентификатор (FK 1: N среди пользователя и порядка).
Реализация
public function index(Request $request)
{
$orders = Order::query()
->when($request->user()->isNot('admin'), function ($query) use ($request) {
return $request->user()->orders();
// Or return $query->where('user_id', $request->user()->id);
})
->paginate();
return OrderResource::collection($orders);
}
Метод when
является ключевым здесь.Обычно вы называете это следующим образом: when($value, $callback)
, и если $value
равно false
, обратный вызов не будет выполнен, в противном случае он будет выполнен.
Так, например, если пользователь не является администратором, вы будетев итоге выполняем этот запрос: Order::paginate();
, который извлекает весь порядок с нумерацией страниц (обратите внимание, что вы можете поменять paginate
на get
.
В противном случае будет выполнен обратный вызов, и вы выполнитеpaginate
метод для $request->user()->orders();
(заказы, вызываемые как метод, по-прежнему являются объектом построения запросов, поэтому вы можете вызывать paginate для него). Запрос будет выглядеть так: $request->user()->orders()->paginate();
Если вместо этого вы выбралиВторое решение в обратном вызове заключается в добавлении условия where (фильтрация по user_id заказов) в основную область, чтобы получать только заказы пользователя. Запрос будет: Order::query()->where('user_id', $request->user()->id)->paginate();
Наконец, чтобы лучшеконтролировать то, что отправляется обратно в качестве ответа. Я использую Ресурс API Laravel (и я действительно предлагаю вам сделать это, если вам нужно настроить ответы).
ПРИМЕЧАНИЕ: Код миграцииУ него есть синтаксические и / или логические ошибки, так как это было просто редактирование на лету из рабочего кода, и оно не было проверено, но оно должно дать общее представление о правильной реализации.