Красноречивая модель setRelation генерирующий массив вместо Collection - PullRequest
0 голосов
/ 06 июля 2018

Если вы делаете $instance = $model->with('categories')->find($id); и после var_dump($instance->categories) он вернет коллекцию категорий.

Но в проекте, над которым я работаю, в некоторых сложных запросах мы не используем и не получаем данные с комбинацией GROUP_CONCAT и CONCAT, например: \DB::raw('GROUP_CONCAT(DISTINCT CONCAT(categories.id, ",,", categories.name) SEPARATOR ";;") as categories'), И затем мы строим отношения, анализируем результат вручную и создаем отношения, используя $instance->setRelation($relation, $data), но по какой-то причине он возвращает массив объектов вместо Collection.

Также есть возможность использовать setRelations(), и этот метод возвращает Collection, но я обнаружил, что если у вас двунаправленные отношения, это создает рекурсию и работает очень медленно. Например: если в User модели мы установили $this->hasMany('Comments'), а в Comments модели мы установили return $this->belongsTo('User'); и после того, как мы запускаем setRelations() для построения отношений вручную, это создает модели вложенности с рекурсией (Пользователь-> Комментарии-> Пользователь и т. д.).

Третий вариант - не использовать setRelation() или setRelations(), а просто вручную создать коллекцию, заполнить ее и установить модель. Но в таком случае оно не будет установлено как модельное отношение.

Любые предложения по правильной сборке вручную (создание отношений аналогично красноречивому созданию с помощью with).

1 Ответ

0 голосов
/ 06 июля 2018

Группировать возврат коллекции, так что вам нужно удалить ключи первой коллекции, и для этого вы можете использовать функцию values коллекции, например,

$instance->setRelation('relation', $data->values()->all());

Подробности https://laravel.com/docs/5.6/collections#method-values

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...