2017-02-08 3 views
2

Кажется, из-за изменения в MySQL 5.7 или выше, режим SQL ONLY_FULL_GROUP_BY включен по умолчанию, так что старый добрый код, который я имел, который выглядел так:Как получить все отдельные строки на основе определенного столбца?

Table::where('name', 'LIKE', '%'.$search_str.'%') 
    ->groupBy('name') 
    ->get(); 

Теперь бросает ошибку ...

SQLSTATE[42000]: Syntax error or access violation: 1055 Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated column 

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

Это то, что я в настоящее время:

Table::where('name', 'LIKE', '%'.$search_str.'%') 
    ->selectRaw('name, ANY_VALUE(id), ANY_VALUE(col_a), ANY_VALUE(col_b), ANY_VALUE(col_c), ANY_VALUE(col_d)') 
    ->groupBy('name') 
    ->get(); 

Это не бросает какие-либо ошибки, но данные столбца отсутствует.

Я также попытался:

Table::where('name', 'LIKE', '%'.$search_str.'%') 
    ->groupBy('name') 
    ->groupBy('id') 
    ->get(); 

Который не возвращает отдельные строки на основе «имя». Он просто возвращает все.

Как это сделать в Laravel Красноречивый или необработанный MySQL?

+0

Вы пробовали '-> distinct() -> get();' – EddyTheDove

+0

Я тоже посмотрел в distinct(). Однако он возвращает только одну строку. Я пытаюсь получить несколько строк. – rotaercz

ответ

0

Метод groupBy() группирует предметы коллекции по заданному ключу. Вы должны получить коллекцию первый:

Table::where('name', 'LIKE', '%'.$search_str.'%') 
    ->get() 
    ->groupBy('name'); 
+0

Это все еще возвращает все результаты, но в группах. Мне нужны только отдельные строки, основанные на имени. Было бы лучше, если бы сам запрос мог обрабатывать все. Это требует попадания в базу данных, а также последующего управления результатом запроса, поэтому он медленнее. – rotaercz

+0

@rotaercz Для этого попробуйте: «Таблица :: select ('name') -> groupBy ('name') -> get();' –

+0

Это не сработает, потому что мне нужна полная строка со всеми ее столбцами. Столбцы могут иметь или не иметь уникальных значений. – rotaercz

0

В config/database.php изменения файла 'strict' => true, в 'strict' => false, и попробовать

Table::where('name', 'LIKE', '%'.$search_str.'%') 
->groupBy('name') 
->get(); 

Я не уверен, если вы ищете это.

+0

Возможно, это сработает, но я хотел бы держать его строгим и заставить его работать. – rotaercz