Laravel转换无法按预期工作

时间:2018-08-16 11:21:30

标签: php laravel laravel-5 eloquent

我有一个很好的查询集合。

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

我正在使用 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。

我要去哪里错了?

1 个答案:

答案 0 :(得分:2)

与地图不同的是,转换需要您返回集合的修改后的项,因为它将替换现有项。

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        let vc = self.storyboard?.instantiateViewController(withIdentifier: "storyboard_id") as! TodoListVC
        vc.selectedCategory = categoryArray[indexPath.row]
        self.navigationController?.pushViewController(vc, animated: true)
    }

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

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

但是,您确实应该为类别建立关系。没有理由在控制器中执行此查找逻辑。