雄辩的模型setRelation生成数组而不是Collection

时间:2018-07-06 09:31:12

标签: laravel eloquent

如果您正在做$instance = $model->with('categories')->find($id);,并且在var_dump($instance->categories)之后,它将返回类别集合。

但是在我正在处理一些繁重的查询的项目中,我们并没有使用GROUP_CONCATCONCAT的组合来获取数据,像这样: \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雄辩地创建方式相同)。

1 个答案:

答案 0 :(得分:1)

分组返回集合的集合,所以您必须删除第一个集合的键,为此,您可以使用values这样的集合功能

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

详细信息https://laravel.com/docs/5.6/collections#method-values