Подтвердить что ты не робот

Группировать по нескольким столбцам в Laravel

Как GROUP BY несколько столбцов в Laravel? Я пробовал этот код:

$routes = DB::table('route')
    ->groupBy('rte_origin')
    ->groupBy('rte_destination')
    ->get();

Но это не работает.

4b9b3361

Ответ 1

Вы пытались:

$routes = DB::table('route')
->groupBy('rte_origin', 'rte_destination')
->get();

Не могу проверить здесь прямо сейчас, но API говорит, что groupBy() принимает массив.

Для справки, пожалуйста, посетите:

Ответ 2

Неверно полагать, что метод 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;
}

Этот метод принимает массив при любом индексе параметра.