如何在Yii2中建立这种关系

如何在Yii2中建立这种关系,yii,yii2,Yii,Yii2,我有一个表staff,表中有id和缩写 相关表格sales中有seller和lister字段-这两个字段都应指向staff表格中的首字母 所以在sales表中,可以有一个不同的工作人员是卖家,而另一个工作人员是列表者——这就是我试图实现的关系 我不确定我能在文件里找到这种东西 在Sales模型中,规则方法我有: [['lister'], 'exist', 'skipOnError' => true, 'targetClass' => Staff::className(), 'targ

我有一个表
staff
,表中有
id
缩写

相关表格
sales
中有
seller
lister
字段-这两个字段都应指向
staff
表格中的
首字母

所以在sales表中,可以有一个不同的工作人员是卖家,而另一个工作人员是列表者——这就是我试图实现的关系

我不确定我能在文件里找到这种东西

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

我肯定我没有在某个地方正确地表示关系,或者我的数据库设计中有缺陷吗?

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

这里的问题是,几个工作人员可能有相同的首字母,在这种情况下,您永远不知道
sales
表所指的是谁。我建议您将
staff.id
保存在
seller
lister
字段中(而不是
缩写

如果我们能在上述问题上达成一致,那么听起来您的
销售
模式中缺少了一种关系。检查一下

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

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
显示首字母

如果对你有效,请告诉我


干杯

向我们展示您销售类别中的对应关系我在销售模式中拥有的是上面的内容。是不是有什么我遗漏了银行,但现在我没有得到错误,在gridview中显示“(未设置)”?是DB中的首字母吗?你能在摘要中显示你的gridview调用吗?当构造与数据提供者一起使用的查询时,你是否缺少带有('staff')的
->?示例:
Sales::find()->with('staff')->all()
。虽然我认为这不是强制性的。数据提供者是否来自SaleSearch模型?如果是这样的话,我使用Gii生成了它,但是没有,它没有与('staff')的关系-尽管我只是尝试了一下,然后它说没有员工关系对不起,我与('lister')和('seller')的关系不好。我发现未设置的错误有点奇怪。这通常意味着该字段设置为空。。但我猜seller/lister的值为1(或任何其他现有行),因此它应该可以工作。