Почему невозможно использовать groupBy () в запросе на загрузку - Laravel - PullRequest
0 голосов
/ 27 апреля 2020

ErrorException:

stripos() expects parameter 1 to be string, object given

Для вызова groupBy() в методе with()

$user = User::with([
    'pricelists' => function($query) {
        $query->groupBy(function($var) {
            return Carbon::parse($var->pivot->created_at)->format('m');
        });
     }
])->where('id', $id)->get();

Я уже видел несколько сообщений о том, как справиться с этой проблемой и что не может быть возможности использовать groupBy() в красноречивом, но я не очень понимаю, почему ...

Чтобы было ясно:

User и Pricelist модель получила много отношение ко-многим с методом по умолчанию timestamps(). Я пытаюсь получить загруженные прайс-листы, сгруппированные по месяцам их загрузки из текущего пользователя.

После нескольких попыток я просто удалил показанный выше оператор => function($query... из метода with() и просто оставил with(['pricelist']), чтобы получить все наборы данных и пробовал это:

$user->pricelists = $user->pricelists->groupBy(function($var) {
    return Carbon::parse($var->pivot->created_at)->format('m');
});
return $user->pricelists;

И он работает нормально и возвращает массив с несколькими массивами для каждого месяца ... Но возвращает это так:

return $user;

возвращает только 1 массив со всеми записями ... Я не совсем понимаю смысл этого сейчас ...

1 Ответ

2 голосов
/ 28 апреля 2020

Два метода groupBy(), которые вы используете в двух предоставленных вами кодах, совершенно разные методы.

Первый groupBy(), в котором вы используете его в обратном вызове, фактически вызывается $query который является построителем запросов объектом. groupBy() здесь используется для добавления SQL GROUP BY Statement в запрос. И согласно документации , в качестве параметра принимаются только строковые переменные.

groupBy() во втором коде вызывается $user->pricelists, что является laravel красноречивая коллекция . Метод groupBy() здесь на самом деле взят из базового класса коллекции и используется для группировки элементов внутри коллекции в несколько коллекций под другим ключом, определяемым параметром, передаваемым функции. Пожалуйста, прочитайте документацию здесь .

В вашем случае вам следует использовать второй groupBy(), так как вы планируете использовать обратный вызов и позволит вам использовать более сложные логи c.

...