2015-11-05 4 views
1

У меня есть 3 модели:Laravel 5 Красноречивые отношения между 3 моделями

  1. Отец
  2. Сон
  3. внуку

Отношения очевидно, отец может иметь много сыновей и его сыновей может иметь много внуков.

То, что я хочу добиться того, чтобы узнать, сколько внуков отец имеет.

Я знаю, что, чтобы узнать, сколько сыновей у него есть я должен использовать это:

Father::find(1)->sons->count(); 

Но как я могу узнать, сколько внуков у него есть?

+0

Вам нужно будет пройти через сыновей, узнать, сколько у них внуков, и суммировать их. К сожалению, я не думаю, что Eloquent сможет сделать это проще. В этом конкретном случае мне было бы интересно, стоит ли писать ручной SQL-запрос, который вернет число внуков для отца, а затем просто назовите его как «Отец» :: find (1) -> getGrandsonCount(); или что-то. –

+0

Отношения очевидны. Однако структура отсутствует. Отец, единственный стол. Есть и таблица сыновей. Тогда у вас есть мост «M..N» или вы просто подключаете отца к столу отца. (что делает его по существу столом для людей) – cjds

+0

Каждая модель имеет один стол, это очевидно. Модель отца $ this-> hasMany ('App \ Son'); Son model $ this-> hasMany ('App \ Grandson'); От одного до многих отношений между ними. – paulalexandru

ответ

1

Если вы не хотите, чтобы петли через Sons, вы можете определить hasManyThrough отношение на модели Отца, так как:

class Father 
{ 
    public function grandsons() 
    { 
     return $this->hasManyThrough('GrandSon', 'Son'); 
    } 
} 

Проверьте здесь для справки: http://laravel.com/docs/5.1/eloquent-relationships#has-many-through

1

В дополнение к @ jsphpl ответ, вы также можете продолжить цепочку, но с помощью методов вместо вызовов свойств.

Father::find(1)->sons()->grandsons()->grandgrandsons()->count(); 

Это происходит потому, что sons() возвращает отношение, а не коллекции, так grandsons() будет продолжать строить запрос от этого sons() запроса. То же самое относится к grandgrandsons().