2016-08-27 97 views
2

以下查詢適用於Laravel 5.2,但不適用於Laravel 5.3。Laravel 5.3 groupBy()破碎?

$messages = Message::with('sender.profile', 'recipient.profile') 
    ->where('sender_id', 1) 
    ->orWhere('recipient_id', 1) 
    ->groupBy('thread') 
    ->get(); 

當在5.3上運行我收到以下錯誤消息

SQLSTATE[42000]: Syntax error or access violation: 1055 
'tmp_laravel.messages.id' isn't in GROUP BY (SQL: select * from `messages` 
where `sender_id` = 1 or `recipient_id` = 1 group by `thread`) 

現在,你說這是一個數據庫的問題之前,請記住:此相同的查詢工作在Laravel 5.2 相同數據庫。所以如果這是我的MariaDB版本,那肯定不適用於L5.2,對吧?

另外,如果我直接在Sequel Pro中運行查詢,它的工作原理。

事實上,只是爲了確保升級我的應用程序時不會出現這種情況,我安裝了兩個新的Laravel:5.2和5.3。並在每個代碼中安裝完全相同的代碼,以使它們與控制器,模型,路徑,.env等相同,然後在每個版本中再次運行查詢。相同的結果:在L5.2中工作並在L5.3中中斷。

回答

2
select * from `messages` 
where `sender_id` = 1 
    or `recipient_id` = 1 
group by `thread` 

該查詢無效,但在嚴格模式禁用的MySQL/MariaDB中「有效」。 Laravel不使用服務器的默認設置。您需要在MySQL設置中修改您的config/database.php並設置

'strict' => false, 

但是,您應該考慮重寫該查詢以顯式選擇每個線程的第一個/最後一個消息。

+0

我會接受你的建議並找出一個新的查詢。謝謝! – timgavin

+0

你會推薦什麼作爲重寫? – timgavin

+0

@timgavin - 寫一個新問題。這是關於嚴格的模式和設置。有很多關於SO的回答問題,比如「如何選擇每組最新/最舊的條目?」對於MySQL。但是我還沒有看到一個laravel解決方案。如果你在這裏發佈了一個新問題的鏈接,我會在稍後看一看。 –