#laravel #eloquent
#laravel #красноречивый
Вопрос:
У меня есть этот запрос. В настоящее время отображается status_count для зарегистрированных пользователей. Я хочу обновить этот запрос, чтобы отобразить все статусы из таблицы состояний, и если у зарегистрированного пользователя нет записи для каких-либо статусов, чтобы отобразить status_count как 0.
$orderStatistics = OrderHeader::select('status.id', 'status.name', 'status.description', 'status.type', 'status.code',
DB::raw('order_status,count(*) as status_count'))
->leftjoin('status', 'status.code', '=', 'order_header.order_status')
->orderBy('status.id')
->groupBy('order_status')
->where([['order_header.user_id', auth()->user()->id], ['status.type', 'ORD']])
->get();
Допустим, в таблице состояния есть одна новая запись TST, где тип равен ORD . И таблица order_header не содержит никаких записей для TST для текущего зарегистрированного пользователя.
Текущий ответ:
"data": [
{
"id": 11,
"name": "note",
"description": "note",
"type": "ORD",
"code": "NTE",
"order_status": "NTE",
"status_count": 2
},
{
"id": 12,
"name": "approved",
"description": "approved",
"type": "ORD",
"code": "APR",
"order_status": "APR",
"status_count": 2
},
]
Как я хочу, это:
"data": [
{
"id": 11,
"name": "note",
"description": "note",
"type": "ORD",
"code": "NTE",
"order_status": "NTE",
"status_count": 2
},
{
"id": 12,
"name": "approved",
"description": "approved",
"type": "ORD",
"code": "APR",
"order_status": "APR",
"status_count": 2
},
{
"id": 13,
"name": "test",
"description": "test",
"type": "ORD",
"code": "TST",
"order_status": "TST",
"status_count": 0
},
]
Как обновить мой запрос для достижения этой цели с помощью IFNULL. Заранее спасибо.
Комментарии:
1.
order_status,count(*)
это опечатка? должна ли запятая быть точкой?2. Нет, это правильно.
3. Левое соединение объединит все записи
order_headers
с соответствующими записями,status
а затем также сохранит все записиorder_headers
без соответствующейstatus
записи. Я предполагаю, что вы хотите обратного, поэтому, возможно, попробуйте выполнитьrightJoin
группировку иstatus.code
(хотя я уверен, что может быть больше нюансов, чем просто это)4. @apokryfos спасибо за ответ. Я предполагаю, что мой запрос выше неверен, поскольку я написал условие для возврата только для зарегистрированного пользователя. теперь я хочу отобразить все статусы из таблицы состояния с типом ORD и отобразить счетчик для зарегистрированного пользователя, если нет подсчета, отображать status_count как 0. был бы признателен, если бы вы могли мне помочь с этим. Спасибо.
Ответ №1:
Предполагая, что вы правильно настроили свои модельные отношения, вы должны быть в состоянии сделать это, связав:
withCount('status')
Документы: https://laravel.com/docs/8.x/eloquent-relationships#counting-related-models
Комментарии:
1. У меня нет модельных отношений для этого. Просто мне нужно отобразить все статусы с типом ORD из таблицы состояния, и если у текущего зарегистрированного пользователя нет записи для статуса, чтобы отобразить status_count для него как 0.