【问题标题】:Eloquent model setRelation generating array instead of Collection雄辩的模型 setRelation 生成数组而不是 Collection
【发布时间】:2018-07-06 19:17:49
【问题描述】:

如果你在做$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() 手动构建关系之后,它会创建具有递归的嵌套模型(用户->评论->用户等)。

第三个选项是不使用setRelation()setRelations(),而只是手动创建集合,填充它并设置为模型。但在这种情况下,它不会被设置为模型关系。

关于如何以正确的方式手动构建的任何建议(创建关系与使用with 雄辩创建的方式相同)。

【问题讨论】:

  • 你可以试试$instance->setRelation('relation', $data->values()->all());group返回collection的collection,使用->values()从group by collection中删除key

标签: laravel eloquent


【解决方案1】:

集合返回集合,因此您必须删除第一个集合的键,为此您可以像这样使用集合的values函数

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

详情https://laravel.com/docs/5.6/collections#method-values

【讨论】:

    猜你喜欢
    • 2014-11-10
    • 2021-08-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-05
    • 2015-08-15
    • 1970-01-01
    • 2019-02-12
    相关资源
    最近更新 更多