2016-08-27 7 views
2

다음 쿼리는 Laravel 5.2에서는 작동하지만 Laravel 5.3에서는 작동하지 않습니다. 이 같은 쿼리는 같은 데이터베이스에 Laravel 5.2에서 작동 : 5.3에서 실행하면Laravel 5.3 groupBy() 깨졌습니까?

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

나는 당신이 데이터베이스 문제를 말할 전에, 기억, 이제 다음과 같은 오류 메시지가

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`) 

을받을 수 있습니다. 그래서 MariaDB의 제 버전이라면 L5.2에서 제대로 작동하지 않아야합니다. 맞습니까?

또한 Sequel Pro에서 직접 쿼리를 실행하면 작동합니다.

사실 내 앱을 업그레이드 할 때 내가 한 일이 아니 었는지 확인하기 위해 Laravel의 새로운 복사본 2 개 (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은 서버 기본 설정을 사용하지 않습니다. config/database.php을 수정하고 MySQL 설정에서

'strict' => false, 

으로 설정해야합니다.

그러나 스레드 당 첫 번째/마지막 메시지를 명시 적으로 선택하려면 해당 쿼리를 다시 작성해야합니다.

+0

귀하의 조언을 듣고 새로운 쿼리를 찾아 낼 것입니다. 감사! – timgavin

+0

재 작성으로 무엇을 권하고 싶습니까? – timgavin

+0

@timgavin - 새로운 질문이 있습니다. 이것은 엄격한 모드와 설정에 관한 것입니다. "그룹별로 최신/가장 오래된 항목을 선택하는 방법"과 같은 많은 질문이 있습니다. MySQL 용. 그러나 아직 나는 laravel 해결책을 보지 못했습니다. 여기에 새 질문에 대한 링크를 게시하면 나중에 살펴 보겠습니다. –