Как отобразить 0, если в laravel нет записи

#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.