Yii2与4个表连接关系

时间:2016-08-01 05:10:03

标签: php mysql yii2

我有4张桌子,比如桌子A,B,C,D。 有点像:

A - a_id, a_name.
B - b_id, a_id, b_name.
C - c_id, b_id, d_id.
D - d_id, d_name

如何获得表D对象的相应主键值即ie。如果A中的id值是20,我需要来自d表的所有数据对应于yii2中的数据。

A -> B是一对多的。

有人请帮忙!

3 个答案:

答案 0 :(得分:1)

首先,最好给出真实世界的例子以便更好地理解。我认为将同一个表的主键命名为id(而a_id表不是a)是更好的做法。

这可以使用关系链来完成。例如,如果我们有3个模型:TestQuestionAnswer(测试有很多问题,问题有很多答案),有了答案模型,我们可以访问测试模型,如下所示: / p>

$answer = Answer:findOne(20); // id must exist
$test = $answer->question->test;

但它不起作用反之亦然有很多,因为我们需要知道具体的模型才能继续链,所以我们不能写出类似的东西:

$answer = $test->question->answer

只接受$test->questions$question->answers

这正是你的情况。阅读官方文档中的Working with Relational Data文章,以便更好地理解。

答案 1 :(得分:0)

如果你想使用关系,那么首先你需要确保表A是通过某些表连接到表D你的情况表A用a_id连接到表B,表B用表c连接b_id和表C和表D通过表c中的d_id连接。 现在,如果你想要表D中的数据,那么你必须建立关系 首先建立关系

      public function getB(){
return $this->hasOne(B::className(),['a_id' => 'a_id'])
    }
public function getC(){

返回$ this-> hasOne(C :: className(),['b_id'=>'b_id']) } 现在你想要通过关系C连接的A和D数据,所以你必须建立像

这样的关系
    public function getD(){
return $this->hasOne(D::className(),['d_id' => 'a_id'])->via('c')
}

首先找到A

$model = A::findOne(20);
echo isset($model->c)?$model->c->d_name:'';

答案 2 :(得分:0)

我得到了一个与你相同的4或甚至更多关系的情况,表格如下:

Link - id, SalesItemId.
SalesItem - id, SoId, ItemName
SalesOrder - id, SalesId, OrderNo
User - id, ManagerId, Name 
User - id, Name 

**用户表我已经相关2次,因为我需要获取用户的经理名称

Link模型中,我得到了以下方法:

public function getLinkSalesitem() {
    return $this->hasOne(Salesitem::className(), ['id' => 'SalesItemId']);
}
public function getLinkSalesorder() {
    return $this->hasOne(Salesorder::className(), ['id' => 'SoId'])
            ->via('linkSalesitem');
            // ->viaTable('salesitem', ['id' => 'SalesItemId']); //either this line or above are the same
}
public function getLinkSales() {
    return $this->hasOne(User::className(), ['id' => 'SalesId'])
            ->via('linkSalesorder'); 
}
public function getLinkManager() {
    return $this->hasOne(User::className(), ['id' => 'ManagerId'])
            ->via('linkSales'); 
}

在视图文件中,我只是通过

检索管理器名称
$model->linkManager->Name;