Laravel通过数据透视表获得两个后代模型

时间:2019-01-03 10:27:59

标签: laravel laravel-4

我正在使用Laravel v4.1 ...是的,我知道它很旧。我的问题是如何建立模型并着手获取与两个枢纽分析表关联的“两个”级别的相关模型。

例如...

我的数据库表:

第一

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

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

三分之二

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

第一秒

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 :(得分:0)

根据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;

如果这不起作用,则可以按照旧的方式进行操作,从关系中收集所有第三项ID,然后手动查询:

$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));

答案 1 :(得分:0)

@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' ] ;
    }
}