Сохранение ключей группы Laravel в сериализации коллекций - PullRequest
0 голосов
/ 29 октября 2019

Laravel v.5.8:

Я хочу сгруппировать каждое дочернее отношение бюджетов и json его сериализовать.

$monthbudgets = \App\BudgetMonth::where('month', $curmonth)->with("budgets")->get();
    foreach ($monthbudgets as $month) {
        $month->budgets = $month->budgets->groupBy("customer_id");
    }
dd($monthbudgets[8]);

, который вернет:

//laravel collection of "budgets"
...[
    1 => [
        0 => []
        1 => []
    ],
    5 => [
        0 => []
    ]
]...

, но используя dd($monthbudgets[8]->jsonSerialize()), он вернет:

//array of "budgets"
...[
    0 => []
    1 => []
    2 => []
]...

Похоже, что он сплющивает его и удаляет ключи (1, 5).

Я тоже открытпредложения по минимизации цикла группировки. Я попытался

->with(["budgets" => function ($query) {
    $query->groupBy("customer_id");
}])->get();

, что приведет к

Syntax error or access violation: 1055 'budgets.id' isn't in GROUP BY (...)

1 Ответ

1 голос
/ 29 октября 2019

Laravel's jsonSerialize вызовет toArray:

// Model.php
public function toArray()
{
    return array_merge($this->attributesToArray(), $this->relationsToArray());
}

, который объединяет атрибуты, а затем отношения, которые заставляют его перезаписывать заданный вами атрибут.

Вы можете установитьотношение с setRelation

foreach ($monthbudgets as $month) {
    $month->setRelation('budgets', $month->budgets->groupBy("customer_id"));
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...