HasMany与belongsToMany的关系

时间:2014-11-03 16:26:52

标签: database laravel laravel-4 eloquent relationship

我有3个模型:PersonsEventsFilesPersons可以包含多个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');
}

是否可以直接在PersonsFiles之间创建一个转换为以下内容的关系:

$files = Person::find($id)->events->files;
// OR
$files = Person::find($id)->files;

谢谢!

3 个答案:

答案 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