Если вы делаете $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
).