Как GROUP BY
несколько столбцов в Laravel?
Я пробовал этот код:
$routes = DB::table('route')
->groupBy('rte_origin')
->groupBy('rte_destination')
->get();
Но это не работает.
Как GROUP BY
несколько столбцов в Laravel?
Я пробовал этот код:
$routes = DB::table('route')
->groupBy('rte_origin')
->groupBy('rte_destination')
->get();
Но это не работает.
Вы пытались:
$routes = DB::table('route')
->groupBy('rte_origin', 'rte_destination')
->get();
Не могу проверить здесь прямо сейчас, но API говорит, что groupBy() принимает массив.
Для справки, пожалуйста, посетите:
Неверно полагать, что метод Database\Query\Builder:: groupBy() принимает массивы в качестве аргументов. В настоящее время он будет принимать только N число строковых аргументов.
Начиная с этой записи, текущая версия Laravel Framework: v4.2.4, а код метода Database\Query\Builder:: groupBy() выглядит следующим образом:
/**
* Add a "group by" clause to the query.
*
* @param dynamic $columns
* @return \Illuminate\Database\Query\Builder|static
*/
public function groupBy()
{
$this->groups = array_merge((array) $this->groups, func_get_args());
return $this;
}
Если вы думаете об этом, func_get_args() возвращает массив всех столбцов, которые могли быть отправлены в виде строк. Поэтому ожидаемый ввод этой функции:
$builder->groupBy('column1', 'column2', ...);
Получаемое свойство $this- > groups в объекте builder должно быть массивом строк, например:
['column1','column2']
Однако, если мы отправили массив в метод выше, например:
$builder->groupBy(['column1','column2']);
свойство $this- > groups будет иметь вложенный массив, который выглядит следующим образом:
[['column1','column2']]
Остальная структура построителя запросов ожидает, что свойство $builder- > groups будет не вложенным массивом строк. Таким образом, когда фреймворк пытается коллизировать и обертывать имена таблиц в их собственном экранированном формате (у каждого механизма базы данных есть другой оператор escape-имен таблицы), он пытается обернуть массив вместо строки, и вы получите свою ошибку.
Строкой ошибки является строка 49 в базе данных \Grammar:: wrap().
Если мы должны были изменить метод Database\Query\Builder:: groupBy(), чтобы заставить его принимать массивы, мы перепишем его как-то вроде следующего:
public function groupBy()
{
$args = func_get_args();
foreach($args AS $arg)
{
$arg = (is_array($arg)) ? $arg:[$arg];
$this->groups = array_merge((array) $this->groups, $arg);
}
return $this;
}
Этот метод принимает массив при любом индексе параметра.