SQLSTATE [42000]: синтаксическая ошибка или нарушение доступа: 1055 Laravel 5,8 MySQL - PullRequest
1 голос
/ 04 марта 2020

У меня MySQL Запрос (это работа), например:

SELECT 
    project_bills.*, 
    project_deliveryorder.totalcost,
    project_deliveryorder.deliveryorder_number,
    project_deliveryorder.deliveryorder_subject,
    SUM(project_bills_payment.payment_amount) AS TOTAL
FROM 
    project_bills 
JOIN
    project_deliveryorder ON project_bills.id_deliveryorder = project_deliveryorder.id
JOIN
    project_bills_payment ON project_bills.id = project_bills_payment.id_bill
GROUP BY
    project_bills.id
ORDER BY
    project_bills.bill_date, project_bills.id DESC;

, и я попытался перевести в Laravel формат как:

DB::table('project_bills')
    ->join('project_deliveryorder', 'project_bills.id_deliveryorder', '=', 'project_deliveryorder.id')
    ->join('project_bills_payment', 'project_bills.id', '=', 'project_bills_payment.id_bill')
    ->select('project_bills.*', 'project_deliveryorder.totalcost', 'project_deliveryorder.deliveryorder_number', 'project_deliveryorder.deliveryorder_subject', DB::raw('SUM(project_bills_payment.payment_amount) AS TOTAL'))
    ->groupBy('project_bills.id')
    ->orderBy('project_bills.bill_date', 'DESC')
    ->orderBy('project_bills.id', 'DESC')
    ->get();

, а затем я получил некоторые ошибки, например:

SQLSTATE [42000]: синтаксическая ошибка или нарушение прав доступа: 1055 'db_tcm.project_bills.id_deliveryorder' нет в GROUP BY

Я прочитал Группировка по неработоспособности - Laravel также в переполнении стека, так какой лучший способ решить эту проблему?

  • Изменить конфигурацию базы данных ('strict' => true)?
  • Отключить «ONLY_FULL_GROUP_BY» на MySQL?
  • Или пересобрать построитель запросов Laravel?

1 Ответ

2 голосов
/ 04 марта 2020

Если в вашем запросе GROUP BY, вы можете выбрать только те столбцы, которые находятся в GROUP BY или являются агрегированной функцией, такой как SUM(), MIN(), MAX() et c.

Если я правильно понимаю ваши данные, вы можете извлечь SUM() в отдельном запросе, где вы JOIN добавите его в основной запрос.

DB::table('project_bills as pb')
    ->join('project_deliveryorder as pdo', 'pb.id_deliveryorder', '=', 'pdo.id')
    ->join(DB::raw('(SELECT id_bill, SUM(payment_amount) AS TOTAL
                      FROM project_bills_payment
                      GROUP BY id_bill) AS pbp'), 'pb.id', '=', 'pbp.id_bill')
    ->select('pb.*', 
             'pdo.totalcost', 
             'pdo.deliveryorder_number', 
             'pdo.deliveryorder_subject', 
             'pbp.TOTAL')
    ->orderBy('pb.bill_date', 'DESC')
    ->orderBy('pb.id', 'DESC')
    ->get();

Отключение строгого режима или отключение ONLY_FULL_GROUP_BY, на мой взгляд, не очень хорошая идея, и если вы можете избежать этого, переработав свой запрос, обычно это намного лучше.

...