Как исправить запрос с PostgreSQL на MySQL в Laravel?

Имею некое количество однотипных контроллеров для админки. Создал репозиторий, куда вынес логику для таких контроллеров.
Изначально всё писалось под PostgreSQL. По неким причинам пришлось развернуть проект на MySQL.
Сразу же вылезла проблема.
Метод index выводит список записей переданной в него модели.
Так же происходит выборка из таблицы переводов для этой модели.
Так же учтено сортировка записей, выборка по запросу из поиска.
Но проблема возникает при выборке всех записей. Отметил этот проблемный код.
public function index($request, $model, $whereArr = null)
    {
        $item = new $model;
        $table = $item->getTable();
        $translationsTable = $item->translationsTable;
        $entityNameArr = array_reverse(explode('_', $translationsTable));
        unset($entityNameArr[0]);
        $entityName = implode('_', array_reverse($entityNameArr));

        $query = $item;
        if (is_array($item->translatedAttributes)) {
            if ($request->has('query')) {
                $query::withTranslation()->search((string)$request->get('query'));
            } else {

                // Проблемный код
                $query = $item::join($translationsTable . ' as t', function ($join) use ($table, $entityName) {
                    $join->on($table . '.id', '=', 't.' . $entityName . '_id')
                      ->where('t' . '.locale', '=', 'ru');
                });
                $query
                  ->select($table . '.*')
                  ->groupBy($table . '.id', 't.id')
                  ->with('translations')
                  ->order($request)
                  ->filter($request);
                 // Проблемный код

            }
        } else {
            if ($request->has('query')) {
                $query = $query::search((string)$request->get('query'));
            } else {
                $query = $query::filter($request)->order($request);
            }
        }

        if (!is_null($whereArr) && is_array($whereArr)) {
            foreach ($whereArr as $k => $where) {
                $query = $query->where($k, $where);
            }
        }

        $items = $query->paginate(10);

        return response()->json(compact('items'));
    }


Как исправить этот запрос под MySQL?
В чем разница при написании join/groupBy/addSelect под Postgre и MySQL?

Результирующий запрос на PostgreSQL (отрабатывает):
select `articles`.`created_at`, `articles`.`id`, `articles`.`slug`, `articles`.`image`, `articles`.`views`, `articles`.`article_category_id`, `articles`.`publish`, `t`.`title`, `t`.`content`, `t`.`seo_title`, `t`.`seo_description`, `t`.`seo_keywords` 
from `articles` 
inner join `article_translations` as `t` on `articles`.`id` = `t`.`article_id` and `t`.`locale` = ? where `articles`.`deleted_at` is null 
group by `articles`.`id`, `t`.`id` 
order by `title` desc, `article_category_id` desc, `created_at` desc

И на MySQL (выдаёт ошибку):
select `articles`.`created_at`, `articles`.`id`, `articles`.`slug`, `articles`.`image`, `articles`.`views`, `articles`.`article_category_id`, `articles`.`publish`, `t`.`title`, `t`.`content`, `t`.`seo_title`, `t`.`seo_description`, `t`.`seo_keywords` 
from `articles` 
inner join `article_translations` as `t` on `articles`.`id` = `t`.`article_id` and `t`.`locale` = ? 
where `articles`.`deleted_at` is null 
group by `articles`.`id`, `t`.`id` 
order by `title` desc, `article_category_id` desc, `created_at` desc

PDOException: SQLSTATE[42000]: Syntax error or access violation: 1055 'h1442_constructor.articles.created_at' isn't
in GROUP BY in /var/www/h1442/data/www/bot.your-webmasters.com/vendor/doctrine/dbal/lib/Doctrine/DBAL/Driver/PDOConnection.php:77
  • Вопрос задан
  • 375 просмотров
Решения вопроса 1
mrKorg
@mrKorg Автор вопроса
web developer
Решение тут
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

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

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