Laravel数据库关系

时间:2020-01-25 08:17:46

标签: database laravel join

例如,我有3个表:

Table A:
id 
name
Table B
id
name
tableA_id
Table C
id 
name
tableB_id

我需要像这样显示表A中的所有数据和表C中的名称:

id | name | TableC name

我可以这样编写代码以获取tableC的名称:

        $data = DB::table('tableA')
            ->join('tableB','tableB.tableA_id','=','tableA.id')
            ->join('tableC','tableC.tableB_id','=','tableC.id')
            ->select('tableA.id','tableA.name','tableC.name')
            ->get();

但是,如果我想显示更多数据,什么合适的解决方案可以解决此问题而又不会使查询变得庞大并以某种方式将其分隔开来,从而使其更容易在刀片中显示?

1 个答案:

答案 0 :(得分:1)

仅使用HasMany关系,您的命名与Laravel标准不一致,如果以模型的复数形式命名表,则可以避免定义$table = 'a'。您的外键也不是标准的,如果可能的话,您可以避免使用第二个参数,例如表b a_id。阅读此post

class A {
    protected $table = 'a';

    public function bs() {
        return $this->hasMany(B::class, 'tableA_id');
    }
}

class B {
    protected $table = 'b';

    public function cs() {
        return $this->hasMany(C::class, 'tableB_id');
    }
}

class C {
    protected $table = 'c';
}

在此示例中,命名很奇怪,因为制作A,B和C表的复数形式非常不便。

当您要访问C关系时,您可以像这样进行操作,但是您可以在多个关系中描述如何工作。

$a = A::find(1);
$cName = $a->bs->first()->cs->first()->name;