【发布时间】:2018-07-06 19:17:49
【问题描述】:
如果你在做$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 雄辩创建的方式相同)。
【问题讨论】:
-
你可以试试
$instance->setRelation('relation', $data->values()->all());group返回collection的collection,使用->values()从group by collection中删除key