首页 > 解决方案 > Laravel 数据库关系

问题描述

例如,我有 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();

但是,如果我想显示更多数据,那么在不使查询变得庞大并以某种方式将其分开以使其易于在刀片中显示的情况下解决此问题的适当解决方案是什么?

标签: databaselaraveljoin

解决方案


只需使用 HasMany 关系,您的命名与 Laravel 标准不一致,如果您以模型的复数形式命名表,则可以避免定义$table = 'a'. 你的外键也不是标准的,你可以避免第二个参数有很多,如果它们被命名的话,例如 table b a_id。阅读这篇文章就可以了

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;

推荐阅读