如何在Yii2中建立这种关系

时间:2016-04-04 13:27:53

标签: yii yii2

我的表格staff包含字段idinitials

相关表格sales包含字段sellerlister - 这两个字段都应指向initials表格中的staff

因此,在销售表中,可能会有一位不同的工作人员,他是卖方工作人员的卖家 - 这就是我试图实施的关系。

我不确定我能在文档中找到这种东西。

Sales模型中,我有规则方法:

[['lister'], 'exist', 'skipOnError' => true, 'targetClass' => Staff::className(), 'targetAttribute' => ['lister' => 'id']],
[['seller'], 'exist', 'skipOnError' => true, 'targetClass' => Staff::className(), 'targetAttribute' => ['seller' => 'id']],

但是,当我尝试通过staff.initials在gridview中显示关系时,我得到了异常

Getting unknown property: app\models\Sale::staff

我确定我没有在某处正确表示关系,或者我的数据库设计中存在缺陷?

1 个答案:

答案 0 :(得分:1)

首先,它听起来像你的数据模型是有缺陷的。我说这个的唯一原因是因为它可能会影响您需要对代码进行哪些更正。

这里的问题是,一些工作人员可能拥有相同的首字母集,在这种情况下,您永远不会知道您的sales表所指的是谁。我建议您将staff.id保留在sellerlister字段中(而不是initials

如果我们能够就上述内容达成一致,那么您的Sales模型中的关系似乎就错过了。查看official documentation

您需要将以下方法添加到Sales模型中:

public function getSeller()
{
   return $this->hasOne(Staff::className(), ['id' => 'seller']);
}

public function getLister()
{
   return $this->hasOne(Staff::className(), ['id' => 'lister']);
}

完成此操作后,您将能够通过以下方式访问这些:

$sale = Sales::find()->one();
$sale->lister; // will return a Staff object.
$sale->seller; // will return a Staff object.

在gridView中,您应该可以使用seller.initials和/或lister.initials显示缩写。

请告诉我这是否适合您。

干杯