我有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
是一对多的。
有人请帮忙!
答案 0 :(得分:1)
首先,最好给出真实世界的例子以便更好地理解。我认为将同一个表的主键命名为id
(而a_id
表不是a
)是更好的做法。
这可以使用关系链来完成。例如,如果我们有3个模型:Test
,Question
和Answer
(测试有很多问题,问题有很多答案),有了答案模型,我们可以访问测试模型,如下所示: / 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;