2016-04-11 6 views
1

Так вот мои отношения:Laravel 5,2 Eloquent - Нахождение всех идентификаторов через несколько отношений

Фонд принадлежит planCode

planCode принадлежит к planType

Что мне нужно сделать, это найти fund_id, которые являются частью определенных типов планов. Я пытался что-то вроде этого:

$plans = (new 'App\PlanType')->with('planCode.fund')->whereIn('code', ['PENS', 'ANN', 'WEL'])->get();

С этим я получаю три кода плана с их отношениями жаждущих загружены. То, что я хочу, это список всех fund_id. Я пробовал $plans->lists('planCode.fund.fund_id', 'code'), но это возвращает null для fund_id. Есть идеи?

+2

Я думаю, вы можете сделать это, используя hasManyThrough отношения. – atefth

+0

@atefth Правильно, ознакомьтесь с [hasManyThrough] (https://laravel.com/docs/5.2/eloquent-relationships#has-many-through) в документации Laravel. –

+0

wow .... ive было найти хаки по всему этому ... полностью упустил это отношение. Благодарю. Хотите ответить на этот вопрос? –

ответ

2

Так что, если ваши отношения, как это -

PlanCodeимеет многофонды

фондпринадлежит в PlanCode

PlanTypeимеет многоPlanCodes

PlanCodeпринадлежитPlanType

Затем вы можете добавить другие отношения, как это -

PlanTypeимеет многофондовчерезPlanCodes

UPDATE

После добавления функции, как это ваш PlanType класса -

public function funds() { 
    return $this->hasManyThrough('fund', 'planCode', PT, PC); 
} 

Вы можете SIMPL у доступа средства на вашем PlanType модель, как это -

$planType->Funds 

Взгляните на документы here.

+0

Вы можете добавить код/​​описание Nocardium к вашему ответу? Это может помочь прояснить для других –

+0

Я добавил его к обновленному ответу @BillGarrison – atefth

1

Да, у него есть одно в одном. Laravel имеет действительно полезные отношения, так что вам не нужно делать повторяющиеся запросы к базе данных для получения отношений отношений. Это отношение hasManyThrough.

Так вот, например, ваша модель planType имеет много моделей фондов через модель planCode. Ваша модель planType должна содержать метод средств, который выглядит следующим образом, где PC является planCode-> идентификатор имени столбца в таблице фонда, и PT является planType-> Идентификатор столбца в таблице planCode:

public function funds() { 
    return $this->hasManyThrough('fund', 'planCode', PT, PC); 
} 

You может потребоваться полное пространство имен ваших моделей, в зависимости от структуры вашего приложения.