Yii2如何检查两个模型是否已经链接

时间:2015-11-06 19:25:09

标签: yii2 relational-database yii2-model

我有两个通过联结表相关的模型。

$model->link()是用于建立两个模型之间关系的方法。它基本上用两个模型的相应键填充连接表。

如果链接了两个模型并且我尝试再次链接它们,则会出现错误,因为密钥对已存在于联结表中。然后,在尝试链接模型之前,我需要检查这种关系是否存在。

我想我可以为联结表创建一个模型并查询正确的记录。该查询的结果将告诉我是否需要执行链接。

问题是:

是否有一种简单易行的方法来执行此检查,使​​用一些yii内置方法?

4 个答案:

答案 0 :(得分:3)

ActiveQueryexists()方法可以满足您的需求。假设您有一个与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)