Laravel где есть на последней записи - PullRequest
0 голосов
/ 11 февраля 2020

Вот текущий запрос, который я пытаюсь выполнить

Statement::whereHas('history',  function ( $query) use ($end) {
                $query->where('created_at', '<', Carbon::parse($end))->latest()->limit(1)->where('read_flag', '=', 0);
            });
        })->get()

Я пытаюсь получить некоторые операторы, где последнее значение истории имеет read_flag = false.

  • Если последнее значение имеет read_flag = false, модель должна быть возвращена.
  • Если последнее значение истории операторов имеет read_flag = true, модель не должна возвращаться даже если есть более старые истории с read_flag = false.

В данный момент выполняемый мной запрос по-прежнему возвращает более старые значения с read_flag = false, когда я хочу запросить только самую последнюю запись. Есть ли способы достичь этого?

Используемое мной значение $end составляет 2020-02-09 23:59:59

. При использовании запроса мне нужно настроить записи.

Эта запись является более новой записью с read_flag = true

"id":77,
"statement_id":4,
"statement_version_id":4,
"read_count":1,
"unread_count":0,
"read_flag":1,
"created_at":"2020-02-09 12:16:23",
"updated_at":"2020-02-10 12:16:23"
}

Эта запись является более старой записью с read_flag = false

"id":65,
"statement_id":4,
"statement_version_id":4,
"read_count":0,
"unread_count":2,
"read_flag":0,
"created_at":"2020-02-07 13:25:06",
"updated_at":"2020-02-07 13:25:06"
}

Так что при выполнении запроса I не ожидал, что операторы будут возвращены, потому что последняя запись имеет read_flag = true

Однако это вывод, который я получаю

{
"id":4,
"site_id":9786,
"team_id":9421,
"name":"ds",
"company_statement_id":1,
"current_statement_version_id":4,
"system_company_statement_id":null,
"created_at":"2020-02-03 10:17:13",
"updated_at":"2020-02-03 10:17:13",
}

1 Ответ

1 голос
/ 11 февраля 2020

AFAIK, нет встроенной функции eloquent, которая обеспечивает такое поведение.

Однако вы можете отфильтровать вашу коллекцию после извлечения и отклонить элементы, которые не соответствуют вашим критериям, например, (код не тестировался):

$statements = Statement::whereHas('history', function ($query) use ($end) {
    $query->where([
        ['created_at', '<', Carbon::parse($end)],
        ['red_flag', 0]
    ]);
})
->get()
->reject(function($element) use($end) {
    $latestHistory = $element->history()->latest()->first();
    return (Caron::parse($latestHistory->created_at)->gte(Carbon::parse($end)) || $latestHistory->red_flag !== 0);
});

РЕДАКТИРОВАТЬ: Исправлены некоторые опечатки кода.

...