2014-11-03 4 views
0

У меня есть 3 модели: Persons, Events и Files. A Persons может иметь много Events и многие Events могут иметь много Files.HasMany with ownedToMany relationship

| 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

Как и в комментарии, невозможно установить такое отношение корабль со встроенными методами «Красноречивого». Вот как вы можете получить 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 
+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

+0

Нет, 'hasManyThrough' не работает с' ownToMany'. –

+0

Я не понимаю, в чем ваш смысл. Это не «с», он заменяет. Проблема такая? Я не могу проверить это прямо сейчас. – klauskpm

+0

Да, это не будет работать с отношениями, отличными от каскадных, т.е. 'A hasMany B, B hasMany C'. Я вообще не говорю о методе 'with'. –

0

насчет

Person::where('id',$id)->with('events')->with('events.files')->get(); 

? Загрузите, пожалуйста,

+0

Спасибо за ответ. Это прекрасно работает! –

Смежные вопросы