Laravel получает модели двух уровней-потомков через сводные таблицы - PullRequest
0 голосов
/ 03 января 2019

Я использую Laravel v4.1 ... да, я знаю, что он старый. Мой вопрос заключается в том, как настроить свои модели и получить связанные модели, которые находятся на «двух» уровнях и связаны двумя сводными таблицами.

Например ...

Мои таблицы базы данных:

Firsts

id  name
==  =============
1   lorem
2   ipsum

с

id  name
==  =============
3   dolor
4   sit

* 1018 третей *:

id  name
==  =============
5   amet
6   consectetur
7   adipiscing
8   elit

first_second

first_id  second_id
========  =========
1         3
2         4

second_third

second_id  third_id
=========  ========
3          5
3          6
4          7
4          8

Если FirstModel равен 1, то я хотел бы получить следующее от ThirdModel :

id  name
==  =============
5   amet
6   consectetur

Я могу сделать это на расстоянии одного уровня (например, SecondModel ). Есть идеи, как это сделать для ThirdModel ?

Ответы [ 2 ]

0 голосов
/ 04 января 2019

@ thefallen,

Не уверен, почему ни ваш первый метод, ни ваш второй метод не сработали для меня.Я закончил с гибридом двух с некоторыми дополнительными петлями.Не самый чистый / самый красивый, но он выполняет свою работу.

$results = [] ;
$id = 1 ;
$first = FirstModel :: with( [ 'seconds.thirds' ] ) -> find( $id ) ;
$seconds = $first -> seconds -> map( function ( $item ) {
    return $item -> thirds ;
} ) -> toArray() ;
foreach ( $seconds as $item1 ) {
    foreach ( $item1 as $item2 ) {
        $results[ $item2[ 'id' ] ] = $item2[ 'name' ] ;
    }
}
0 голосов
/ 03 января 2019

Согласно документу в 4.1, было сквозное число, так что вы можете попробовать что-то вроде этого:

class FirstModel extends ModelAbstract
{
    public function seconds()
    {
        return $this->belongsToMany(SecondModel::class);
    }

    public function thirds()
    {
        return $this->hasManyThrough(ThirdModel::class, SecondModel::class);
    }
}

class SecondModel extends ModelAbstract
{
    public function thirds()
    {
        return $this->belongsToMany(ThirdModel::class);
    }
}

class ThirdModel extends ModelAbstract {}

А затем получить данные для третьего отношения из первого, как это:

$first = FirstModel::find(1);
$thirds = $first->thirds;

Если это не сработает, вы можете сделать это по старинке, собрав все идентификаторы третьего элемента из отношений и запросив вручную:

$first = FirstModel::with(['seconds.thirds'])->find(1);
$thirdIds = $first->seconds->map(function ($item) {
    return $item->thirds->pluck('id')->toArray();
})->toArray();
$thirds = ThirdModel::whereIn('id', array_flatten($thirdIds));
...