我有3个模型:Persons
,Events
和Files
。 Persons
可以包含多个Events
,而Events
可以有多个Files
。
| persons |
-----------
id
name
| events |
----------
id
person_id
name
| event_file |
--------------
id
event_id
file_id
| files |
---------
id
name
在Persons
模型中我有这种关系:
public function events()
{
return $this->hasMany('Events', 'person_id');
}
在Events
模型中:
public function files()
{
return $this->belongsToMany('Files', 'event_file', 'event_id', 'file_id');
}
是否可以直接在Persons
和Files
之间创建一个转换为以下内容的关系:
$files = Person::find($id)->events->files;
// OR
$files = Person::find($id)->files;
谢谢!
答案 0 :(得分:0)
您可以使用“hasManyThrough”。 在下面的示例中,您可以看到我想通过用户获取帖子。就像你想通过事件获取文件一样。
class Country extends Eloquent {
public function posts()
{
return $this->hasManyThrough('Post', 'User');
}
}
你会调用:
$country->posts;
或者,如你所愿:
Person:find(1)->files;
如果您想要更好的解释,请点击Laravel自己的页面链接: http://laravel.com/docs/4.2/eloquent#has-many-through
答案 1 :(得分:0)
在评论中,与Eloquent的内置方法建立这种关系是不可能的。以下是使用一些技巧获取files
的方法:
Person::with(['events.files' => function ($q) use (&$files) {
$files = $q->get()->unique();
}])->find($id);
然后:
$files; // collection of files related to the Person through collection of his events
请注意,此代码将运行其他查询来获取文件,因此在上面的示例中:
1 fetch Person
2 fetch Events related to Person
3 fetch Files related to all the Events
4 again fetch Files related to all the Events
答案 2 :(得分:0)
怎么样?
Person::where('id',$id)->with('events')->with('events.files')->get();
? eagerload