Я хочу конвертировать SQL-запрос в Laravel Eloquent - PullRequest
0 голосов
/ 26 сентября 2018

У меня есть этот запрос SQL:

SELECT * 
FROM posts 
RIGHT JOIN files ON posts.id = files.fileable_id 
GROUP BY posts.id 
HAVING posts.user_id = 3125

Это работает, но мне нужно преобразовать его в красноречивый Laravel Я попробовал этот код

 $postsHaveFileCount = DB::table('posts')
                     ->rightJoin('files', 'posts.id', '=', 'files.fileable_id')
                     ->groupBy('posts.id')
                     ->having('posts.user_id', '=', $user->id)
                     ->get()->count();
  echo $postsHaveFileCount;

Но у меня есть эта ошибка

(2/2) QueryException SQLSTATE [42000]: синтаксическая ошибка или нарушение прав доступа: 1055 Выражение № 17 из списка SELECT отсутствует в предложении GROUP BY и содержит неагрегированный столбец staff.files.id, который являетсяфункционально не зависит от столбцов в предложении GROUP BY;это несовместимо с sql_mode = only_full_group_by (SQL: выберите * из posts правое объединение files в posts. id = files. fileable_id, группируйте по posts. id, имея posts. user_id = 3125)

Я буду благодарен за все, чтобы помочь мне решить проблему, заранее спасибо.

Ответы [ 3 ]

0 голосов
/ 26 сентября 2018

Так как вы используете group by, вы должны установить ТОЛЬКО столбцы, которые используются в выражении group by в разделе «select».Если вы не используете какие-либо значения в 'select', Laravel автоматически выберет все столбцы, что выдает вышеуказанную ошибку.Проверьте измененный код ниже

    $postsHaveFileCount = DB::table('posts')
                    ->select('posts.id')
                    ->rightJoin('files', 'posts.id', '=', 'files.fileable_id')
                    ->groupBy('posts.id', 'posts.user_id')
                    ->having('posts.user_id', '=', $user->id)
                    ->get()->count();
    echo $postsHaveFileCount;
0 голосов
/ 26 сентября 2018

Просто запустите

$ sudo mysql -u root -p

для изменения режима SQL для вашего экземпляра MySQL Server

mysql > SET GLOBAL sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''));

другим способом будет использование конфигураций mysql , перейдите в / etc / mysql/my.cnf

**add a section for [mysqld] and right below it add the statement sql_mode = ""
restart the mysql service $ sudo systemctl restart mysql**
0 голосов
/ 26 сентября 2018

Попробуйте это.Скопируйте и вставьте следующую инструкцию в ваш код и запустите ее.

SET GLOBAL sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''));
...