2015-09-29 5 views
0

Я новичок в laravel и eloquent, и я не могу найти пример того, что я пытаюсь сделать, скажем, что у меня есть три таблицы ABC, и все они имеют много разных отношений корабли A - ab - B - bc - C.Laravel сложный запрос с eloquent

ab : table contains key from A and B. 
bc : table contains key from B and C. 

Что делать, если я хочу, чтобы найти объекты с помощью A (a_id = 1)?

Я пытался что-то вроде этого A::find(1) -> B() -> C()->get() ;

B() is method i created to get B objects in A model. 
C() is method i created to get C objects in B model. 

Что я делаю неправильно? Надеюсь, что вопрос и пример ясны.

С уважением.

+0

привет, добро пожаловать на сайт. Возможно, вам захочется отформатировать ваши примеры немного больше. Если это более разборчивые люди будут более склонны помогать. Попробуйте {} buttoton для фрагментов кода. – eeeeeean

ответ

1

Eloquent предлагает hasManyThrough связь ярлык, но поддерживает только one-to-many отношения между моделями. Существуют различные способы обхода в this thread на форуме Laravel.io. Ниже приведено короткое решение от that thread, которое я тестировал и работал. Это должно быть добавлено к базовой модели, что ваши модели будут распространяться:

public function manyThroughMany($related, $through, $firstKey, $secondKey, $pivotKey) 
{ 
    $model = new $related; 
    $table = $model->getTable(); 
    $throughModel = new $through; 
    $pivot = $throughModel->getTable(); 

    return $model 
     ->join($pivot, $pivot . '.' . $pivotKey, '=', $table . '.' . $secondKey) 
     ->select($table . '.*') 
     ->where($pivot . '.' . $firstKey, '=', $this->id); 
} 

Тогда на вашей A модели вы можете определить метод отношения, которое возвращает это:

public function c() 
{ 
    return $this->manyThroughMany('C', 'B', 'b_id', 'id', 'c_id'); 
} 

и доступ соответствующих записей, как так:

A::find(1)->c()->get(); 

Там также class defining a relation для этой цели также в этой теме, но я не проверял, так что я не могу сказать, если он работает должным образом.

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