我有一个名为' Tag'它有一个自我引用的“有很多”的东西。关系本身。例如,我有一个名为UK的标签,而且这个标签有很多'儿童标签称为伦敦,利物浦,曼彻斯特等。
以下是Tag模型文件中的关系:
public function children()
{
return $this->hasMany('App\Tag', 'tag_parent');
}
我只是想从父母'英国'中获取儿童城市列表。标签。所以我有这个代码:
$cities = Tag::where('title', 'UK')->get()->children;
我收到一个错误,说孩子不知道。文档说我应该按预期工作。
$cities = Tag::find($id)->children;
那么我如何获得这些儿童城市列表中的'其中'条件?我认为Tag :: find($ id)只是Tag ::的快捷方式(' id',$ id) - > get()?
更新
确切错误:
ErrorException in TagController.php line 28:
Undefined property: Illuminate\Database\Eloquent\Collection::$children
答案 0 :(得分:0)
如@revo所述,请使用with
方法。它在Laravel中被称为Eager Loading。
Tag::with('children')->where('title', 'UK')->get();
这应该为您提供title = UK
的所有标记,以及与每个标记相关的所有子标记。
答案 1 :(得分:0)
get()
将始终返回Collection
,即使只有一条记录。由于Collection
没有children
属性,因此您会看到“未定义属性”错误。
find()
工作的原因是因为它返回了Tag
模型,该模型具有children
属性。
如果title
是唯一的,您可以简单地从get()
更改为first()
。 first()
将始终返回Model
个实例; get()
将始终返回Collection
。
$cities = Tag::where('title', 'UK')->first()->children;
如果title
不是唯一的,那么您需要遍历已返回的Collection
的{{1}},并相应地对每组儿童采取行动。
Tag
注意:$tags = Tag::with('children')->where('title', 'UK')->get();
foreach($tags as $tag) {
$cities = $tag->children;
// do something with this set of children.
}
纯粹是出于性能原因(eager loading)而添加的。它不会影响代码的其余部分,并且可以在不更改任何其他内容的情况下删除。