我有两个通过联结表相关的模型。
$model->link()
是用于建立两个模型之间关系的方法。它基本上用两个模型的相应键填充连接表。
如果链接了两个模型并且我尝试再次链接它们,则会出现错误,因为密钥对已存在于联结表中。然后,在尝试链接模型之前,我需要检查这种关系是否存在。
我想我可以为联结表创建一个模型并查询正确的记录。该查询的结果将告诉我是否需要执行链接。
问题是:
是否有一种简单易行的方法来执行此检查,使用一些yii内置方法?
答案 0 :(得分:3)
ActiveQuery
有exists()
方法可以满足您的需求。假设您有一个与Book
类相关联的Author
类。因此Book
具有getAuthor()
方法。以下是您如何确定相关记录是否存在的信息:
$book->getAuthor()->exists();
请注意,$book->author
会返回Author
的实例(如果是hasMany
关系则返回数组),而getAuthor()
会返回ActiveQuery
个实例。< / p>
执行exists()
仍然运行一个SQL查询,就像$book->author
一样,但该查询比实际获取数据和创建相应模型更有效。
另一方面,在许多情况下,性能提升可以忽略不计,因此您只需运行isset($book->author)
即可完成。
答案 1 :(得分:2)
我认为最简单的方法就是调用关系方法。 使用模型Foo和模型的关系方法Bar getBar()(使用via junction table定义)(new Foo) - &gt; bar如果没有链接则为null。当然,这在一对一关系的情况下是有效的。对于一对多,您必须检查结果数组。
答案 2 :(得分:1)
我已将此方法添加到需要关联的模型中 (在我看来,这是多对多的关系):
/**
* @inheritdoc
*/
public function link($name, $model, $extraColumns = [])
{
$exists = $this->getJunctionModel()
->where(['other_model_id' => $model->primaryKey])
->exists();
if (!$exists) {
parent::link($name, $model, $extraColumns);
}
}
答案 3 :(得分:0)