2016-08-29 3 views
2

У меня есть Post модель, как это:1055 Expression # 3 отборных списка не в GROUP BY ошибка в операторе отношения Laravel ManyToMany 5,3

class Post extends Model 
{ 
     protected $primaryKey = 'post_id'; 
     public function tags() 
     { 
      return $this->belongsToMany('App\Tag'); 
     } 

} 

и Tag Модель:

class Tag extends Model 
{ 
     public function posts() 
     { 
      return $this->belongsToMany('App\Post'); 
     } 

     public function tagsCount() 
     { 
      return $this->belongsToMany('App\Post') 
       ->selectRaw('count(pt_id) as count') 
       ->groupBy('tag_id'); 
     } 

     public function getTagsCountAttribute() 
     { 
      if (! array_key_exists('tagsCount', $this->relations)) $this->load('tagsCount'); 

      $related = $this->getRelation('tagsCount')->first(); 

      return ($related) ? $related->count : 0; 
     } 
} 

(pt_id столбец является полем первичного ключа в post_tag сводная таблица).

Как вы видите, есть ManyToMany соотношение между Post и Tag моделей.

Для учета связанных тегов определенного сообщения, я добавил tagsCount() и getTagsCountAttribute() методов для Tag Модель.

Теперь предположим, что я хочу получить теги граф определенного сообщение, как это:

$post = Post::find($post_id)->get(); 
return $post->tagsCount 

Он работал для меня в Laravel 5.2 (и более ранних версий), но после обновления до Laravel 5.3, ниже показана ошибка:

SQLSTATE[42000]: Syntax error or access violation: 1055 Expression #3 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'aids.post_tag.post_id' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by (SQL: select count(pt_id) as count, `post_tag`.`tag_id` as `pivot_tag_id`, `post_tag`.`post_id` as `pivot_post_id` from `posts` inner join `post_tag` on `posts`.`post_id` = `post_tag`.`post_id` where `post_tag`.`tag_id` in (145) and `posts`.`deleted_at` is null group by `post_tag`.`tag_id`) 

Что такое проблема и как я могу ее решить?

ответ

0

Я не пытаюсь @Ryan, но с добавлением pt_id (поле первичного ключа в сводной таблице post_tag), проблема решена:

public function tagsCount() 
     { 
      return $this->belongsToMany('App\Post') 
       ->selectRaw('count(pt_id) as count') 
       ->groupBy(['tag_id', 'pt_id']); 
     } 
7

Это связано с MySQL 5,7

Короче говоря, одно решение попробовать изменить config/database.php от истинного на ложное:

'mysql' => [ 
    'strict' => false, //behave like 5.6 
    //'strict' => true //behave like 5.7 
], 

Для получения дополнительной информации, смотрите здесь: https://stackoverflow.com/a/39251942/2238694

+0

Я использую ту же версию mysql для laravel 5.2 и 5.3.but, эта проблема возникает только в 5.3. –

+0

Это решило мою проблему. Благодарю. – rotaercz