Мне нужно объединить две таблицы по дате. Проблема в том, что столбец даты сгруппирован по различным форматам, в зависимости от параметра из API.
Например, предположим, что я присоединяюсь к payments
и payment_details
таблицам:
платежей:
id | date
1 2020-01-31
payment_details :
id | date | detail
1 2020-01-31 aaa
Запрос:
$results = Payment::with(['payment_details' => function ($q) {
$q->addSelect('detail');
}])->get();
Оплата. php:
public function payment_details()
{
return $this->hasMany(PaymentDetail::class, 'date', 'date');
}
Результирующий запрос:
select * from payment_details where payment_details.date in ('2020-01-31');
Это прекрасно и дает правильные результаты, потому что связь между нормальными значениями в двух таблицах. Но когда я хочу сгруппировать по date
столбцу по году:
Запрос:
$results = Payment::with(['payment_details' => function ($q) {
$q->addSelect('detail')
}])
->groupBy([DB::raw('YEAR(date)')])
->get();
Результирующий запрос:
select * from payment_details where payment_details.date in ('2020');
Что не правильно, потому что результирующий запрос отношения всегда where payment_details.date
, поэтому он всегда присоединяется к таблицам перед любым GROUP BY
, который я использую. Я думал об использовании псевдонима, но они не работают в where
выражениях.
Так что даже если мой запрос будет:
Запрос:
$results = Payment::with(['payment_details' => function ($q) {
$q->addSelect('detail')
->groupBy('YEAR(date)'); // here
}])->get();
Результат:
Результирующий запрос:
select * from payment_details where payment_details.date in ('2020') group by YEAR(date);
Что по-прежнему неверно - потому что отношение предшествует group by
. Как я могу решить эту проблему?
Идеальным решением будет:
Результирующий запрос:
select * from payment_details where YEAR(payment_details.date) in ('2020') group by YEAR(date);
Но кажется, что я не могу использовать функции в параметры внешнего ключа функций отношения, такие как:
Payment. php:
public function payment_details()
{
return $this->hasMany(PaymentDetail::class, 'YEAR(date)', 'date');
}
Как это даст мне 1=0
вывод.