t-alexashka
@t-alexashka
Сразу пишу legacy код

Как вытащить related-записи с условием?

Это снова я :)

Есть таблица с заказами (orders) и есть таблица с логами заказов (orders_log)
в логах есть поля action (название события) order_id (на каком заказе сработало) и date (когда)
т.е. для одного заказа там может быть несоклько событий в хронологическом порядке (поступил, оформлен, отправлен, получен).
в поисковой модели
$query->joinWith(['logs'])->with('logs');
вытягивает первый попавшийся статус. а нужно чтобы вытягивал один с максимальной датой (ну т.е. самый актуальный статус). как это можно провернуть? чтоб при этом еще и фильтр работал
  • Вопрос задан
  • 86 просмотров
Пригласить эксперта
Ответы на вопрос 2
slo_nik
@slo_nik Куратор тега Yii
Добрый день.
Попробуйте так
->joinWith([
     'logs' => function(ActiveQuery $query){
           $query->where(/* тут условие */);
     }
 ])
Ответ написан
Комментировать
@Antarit
Если вы ваши orders_log в модели достаете, методом который подразумевает релейшн, наподобие
public function getLogs()
{
    return $this->hasMany(Log::className(), ['order_id' => 'id']);
}

Тогда в методе search поисковой модели можно сделать так
$query->joinWith(['logs'])
//фильтры
//$query->filterWhere(какой-то фильтр)
//...
//после всех фильтров
$query->orderBy([Log::tablename().'.date'=>SORT_DESC])->limit(1);
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы