在Yii2中使用模型联接表

时间:2018-07-11 12:00:00

标签: yii yii2 left-join

这是表1

id1  Name
------------
 1   value1
 2   value2

这是表2

id2  Name     id1
---------------------
 1   value1    2
 2   value2    1

这是表3

id3  Name     id2
---------------------
 1   value1    2
 2   value2    1

这是表4

id4  Name     id3
---------------------
 1   value1    2
 2   value2    1

我想用模型将 Yii2中的上述4个表加入

select * from table1 
left join table2 on table2.id2 = table1.id1
left join table3 on table2.id3 = table1.id2
left join table4 on table2.id4 = table1.id3

2 个答案:

答案 0 :(得分:2)

1。使用Yii2 ActiveQuery

第1步:声明关系

要使用Active Record处理关系数据,首先需要在Active Record类中声明关系。任务就像为每个感兴趣的关系声明一个关系方法一样简单,如下所示,

class TableOneModel extends ActiveRecord
{
    // ...
    public function getTableTwo()
    {
        return $this->hasMany(TableTwoModel::className(), ['id1' => 'id1']);
    }
}

class TableTwoModel extends ActiveRecord
{
    // ...
    public function getTableThree()
    {
        return $this->hasMany(TableThreeModel::className(), ['id2' => 'id2']);
    }
}
.....
same create table3 and table4 relation

如果使用hasMany()声明了一个关系,则访问该关系属性将返回相关Active Record实例的数组;如果使用hasOne()声明了一个关系,则访问该关系属性将返回相关的Active Record实例;如果找不到相关数据,则返回null。

第2步:访问关系数据

声明关系后,您可以通过关系名称访问关系数据。这就像访问由Relation方法定义的对象属性一样。因此,我们称其为关联属性。例如,

$query = TableOneModel::find()
           ->joinWith(['tableTwo.tableThree'])
           ->all();

引用yii\db\ActiveQuery

2。使用Yii2数据库查询

$query = (new \yii\db\Query())
        ->from('table1 as tb1')
        ->leftJoin('table2 as tb2', 'tb1.id1 = tb2.id1')
        ->leftJoin('table3 as tb3', 'tb2.id2 = tb3.id2')
        ->leftJoin('table4 as tb4', 'tb3.id3 = tb4.id3')
        ->all();

引用Query Builder documentationleftJoin()

答案 1 :(得分:0)

使用Gii生成模型,如果外键在数据库中定义正确,则将在模型中生成关系。如果不是,则可以自己定义关系。 See it here how to define those relations in a Yii2 model.
然后,您应该可以通过以下方式访问模型Table4的属性:

$table1 = Table1::findById(1);

var_dump($table1->table2->table3->table4->attributes);