Имею некое количество однотипных контроллеров для админки. Создал репозиторий, куда вынес логику для таких контроллеров.
Изначально всё писалось под 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