在Laravel中调用父关系的子关系的语法

时间:2016-07-06 12:16:13

标签: laravel laravel-5.2

我有一个名为' 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

2 个答案:

答案 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)而添加的。它不会影响代码的其余部分,并且可以在不更改任何其他内容的情况下删除。