如果您正在做$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()
来手动建立关系后,便会递归地创建嵌套模型(User-> Comments-> User等)。
第三个选项是不使用setRelation()
或setRelations()
,而只是手动创建Collection,将其填充并设置为模型。但是在这种情况下,将不会将其设置为模型关系。
关于如何以正确方式手动构建的任何建议(创建关系与用with
雄辩地创建方式相同)。
答案 0 :(得分:1)
分组返回集合的集合,所以您必须删除第一个集合的键,为此,您可以使用values
这样的集合功能
$instance->setRelation('relation', $data->values()->all());