我有一个很好的查询集合。
有一列,我想用另一个值替换该值。
我正在使用 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。
我要去哪里错了?
答案 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;
});
但是,您确实应该为类别建立关系。没有理由在控制器中执行此查找逻辑。