AFAIK нет встроенной красноречивой функции, которая дает вам такое поведение. Если вы хотите решить эту проблему только с SQL, вам придется посмотреть на другой ответ, используя SQL function MAX
в подзапросе, и добавить необработанные запросы в Laravel code (возможно, немного эффективнее, чем отказ от несоответствия) .
Однако вы можете отфильтровать свою коллекцию после извлечения и отклонить элементы, которые не соответствуют вашим критериям.
Предполагая переменную $q
имеет тип string и содержит состояние, например «manual», что-то вроде этого должно сделать работу (код не проверен).
$leads = Lead::whereHas('statuses', function ($query) use ($q) {
$query->where('description', 'LIKE', '%' . $q . '%');
})
->with('statuses')
->get()
->reject(function($element) use($q) {
$lastStatus = $element->statuses[count($element->statuses)-1];
return (strpos($lastStatus->description, $q) === false);
});
Если вы столбец description
должен содержать точное Строка "manual" Я бы сделал это вместо этого:
$leads = Lead::whereHas('statuses', function ($query) {
$query->where('description', 'manual');
})
->with('statuses')
->get()
->reject(function($element) {
$lastStatus = $element->statuses[count($element->statuses)-1];
return $lastStatus->description !== 'manual';
});
Метод whereHas
не удалит любые отношения, которые вам нужны. Метод whereHas
только скажет «выбрать записи, у которых есть один или несколько дочерних элементов, соответствующих этому критерию», однако все дочерние записи будут доступны, даже если они не соответствуют вашим критериям, если поскольку у родителя есть тот, который соответствует.
То, что вы хотели бы сказать, это "выберите записи, у которых есть один или несколько дочерних элементов, которые соответствуют этому критерию (whereHas
), ТО удалите всех родителей где последняя дочерняя запись не соответствует записи, которую я ищу (reject
) "
Редактировать: обновлен код с использованием ->with('statuses')
для повышения производительности.