【问题标题】:Laravel transform not working as intended on collectionLaravel 转换在收集时无法按预期工作
【发布时间】:2018-08-16 19:41:43
【问题描述】:

我有一个雄辩的查询集合。

有一列我想用另一个值替换该值

我正在使用 transform 函数来执行此操作,但它没有按预期工作。

这是我在控制器中的查询

    $articles = KnowledgeBaseArticle::getArticlesByDepartment($department)
        ->get()
        ->transform(function ($article) {
          $article->category_id = KnowledgeBaseCategory::find($article->category_id)->name;
        });

还有getArticlesByDepartment 来自模型的查询

    public function scopeGetArticlesByDepartment($query, $department){
                return $query->where('department', $department)
                            ->select('title', 'updated_at', 'department', 'id', 'category_id')
                            ->orderBy('title', 'asc');
    }

我想返回它,以便将列 category_id 的所有行替换为类别名称。您可以看到我正在尝试通过使用 $article->category_id 来执行此操作,方法是使用 KnowledgeBaseCategory 模型上的 find 来检索它。但是,这根本不起作用,当我死掉并转储时,我得到一个充满空值的单列数组。

当我死并转储 $article->category_id 并在转换中查找查询时,它返回正确的类别名称,只是没有用类别名称替换 category_id 列。

我也尝试了 map 而不是 transform 并得到了相同的结果。

如果重要,我稍后会将此数据转换为 JSON。

我哪里错了?

【问题讨论】:

  • 为什么不为类别设置关系,而不是在控制器中的 category_id 上进行查找?
  • 因为我试图让这部分工作在我重构为更清晰的代码之前。

标签: php laravel laravel-5 eloquent


【解决方案1】:

Transform 与 map 不同,需要您返回集合的修改项,因为这将替换现有项。

transform(function ($article) {
    $article->category_id = KnowledgeBaseCategory::find($article->category_id)->name;
    return $article;
});

由于对象是可变的并且通过引用传递,您可以在 each() 闭包中执行此操作,而不是保存一行:

each(function ($article) {
    $article->category_id = KnowledgeBaseCategory::find($article->category_id)->name;
});

不过,您确实应该为类别设置关系。没有理由在控制器中执行此查找逻辑。

【讨论】:

  • 太棒了,谢谢,我确实认为这是我错过的一些简单的事情。
猜你喜欢
  • 2015-09-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-24
  • 1970-01-01
  • 1970-01-01
  • 2016-10-01
  • 1970-01-01
相关资源
最近更新 更多