2016-08-24 2 views
6

Этот запрос работает в 5.2:запрос, который работал в Laravel 5.2 дает мне ошибку в Laravel 5,3

$galleries = Gallery::with(array(
      'images' => function ($query) { 
       $query->orderBy('order', 'asc'); 
      } 
     )) 
     ->with('votes') 
     ->leftJoin('votes', 'votes.votable_id', '=', 'gallery.id') 
     ->selectRaw(
      'gallery.*, count(case votes.status when "upvote" then 1 else null end) - count(case votes.status when "downvote" then 1 else null end) as points' 
     ) 
     ->where('votes.votable_type','App\Gallery') 
     ->groupBy('gallery.id') 
     ->orderBy('points', 'desc') 
     ->published()->orderBy('gallery.created_at', 'desc')->paginate(30); 

Я пытаюсь выбрать все галереи, которые имеют голоса, когда я запускаю это в 5.3 я получаю эту

1/2 PDOException in Connection.php line 333: SQLSTATE[42000]: 
Syntax error or access violation: 1055 'images.gallery.title' isn't in GROUP BY 

SQLSTATE[42000]: Syntax error or access violation: 1055 'images.gallery.title' isn't in 
GROUP BY (SQL: select gallery.*, count(case votes.status when "upvote" then 1 else null end) - count(case votes.status when "downvote" then 1 else null end) 
as points from `gallery` left join `votes` on `votes`.`votable_id` = `gallery`.`id` 
where `votes`.`votable_type` = App\Gallery and `published` = 1 group by `gallery`.`id` 
order by `points` desc, `gallery`.`created_at` desc limit 30 offset 0) 
+0

Вы пытались добавить миссию 'gallery.title' в предложение' GROUP BY'? – mazedlx

+0

yes Я попробовал это, тогда он говорит мне добавить все столбцы в моей таблице галереи, поэтому в итоге я получаю следующее: -> groupBy ('gallery.id', 'gallery.title', 'gallery.hash' , 'gallery.user_id', 'gallery.published', 'gallery.views', 'gallery.created_at', 'gallery.updated_at'), но это не выглядит правильно для меня. Вы считаете, что это правильно? –

+1

Документация упоминает в руководстве по обновлению 5.3, что метод 'join' был переписан. https://laravel.com/docs/5.3/upgrade#upgrade-5.3.0 – mazedlx

ответ

1

согласно документации ваш запрос должен присоединиться нравится этот Reference -: https://laravel.com/docs/5.3/upgrade#upgrade-5.3.0

$galleries = Gallery::with(array(
     'images' => function ($query) { 
      $query->orderBy('order', 'asc'); 
     } 
    )) 
    ->with('votes') 
    ->leftJoin('votes',function($query){ 
       $query->on('votes','gallery')->where('votes', 'votes.votable_id', '=', 'gallery.id')->where('votes.votable_type','App\Gallery'); })->selectRaw(
     'gallery.*, count(case votes.status when "upvote" then 1 else null end) - count(case votes.status when "downvote" then 1 else null end) as points' 
    ) 
    ->groupBy('gallery.id') 
    ->orderBy('points', 'desc') 
    ->published()->orderBy('gallery.created_at', 'desc')->paginate(30); 
+0

Привет Хамза, запустив эту ошибку: SQLSTATE [42000]: Синтаксическая ошибка или нарушение доступа: 1064 У вас есть ошибка в синтаксисе SQL ; проверьте руководство, соответствующее версии сервера MariaDB, для правильного синтаксиса, используемого рядом с 'gallery.id 'votes' =? где 'vote'.'votable_type' =? и 'опубликовано' =? grou 'в строке 1 (SQL: select count (*) как совокупность из 'gallery' left join' votes' на 'votes' =' gallery' gallery.id 'votes' = vote.votable_id где' votes'.'votable_type' = App \ Gallery и 'published' = 1 group by' gallery'.'id') какие-нибудь идеи о том, что это значит? –

+0

Я запускаю toSql() в запросе, и это sql, который он производит: «выберите галерею. *, Count (case vote.status, когда« upvote »then else else else end) - count (case votes.status, когда« downvote » затем 1 else null end) в качестве точек из 'gallery' left join' votes' на 'votes' =' gallery' gallery.id 'votes' =? где' votes'.'votable_type' =? и 'published' =? group '' '' '' 'by' points' desc, 'gallery'.'created_at' desc" –

+0

Я обновил ответ, попробуйте это и посмотрим, получите ли вы нужный результат или нет –

11

Перейдите в папку config/database.php. В массиве конфигурации mysql измените strict => true на strict => false, и все будет хорошо работать.

+2

, он работал отлично, но что строго для –