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

Yii2 how to check if two models are already linked

我有两个模型通过一个连接点 table 相关联。

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

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

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

问题是:

是否有使用 yii 内置方法执行此检查的简短方法?

我认为最简单的方法就是调用关联方法。 使用模型 Foo 和模型 Bar getBar() 的关系方法(使用 via junction table 定义)(新 Foo)->如果没有 link,则 bar 为 null。当然,这在一对一关系的情况下有效。对于一对多,您必须检查结果数组。

ActiveQueryexists() 方法可以满足您的需要。假设您有一个链接到 Author class 的 Book class。所以 BookgetAuthor() 方法。查找相关记录是否存在的方法如下:

$book->getAuthor()->exists();

注意 $book->author returns Author 的一个实例(或者数组,如果它是 hasMany 关系),而 getAuthor() returns 一个 ActiveQuery 个实例。

执行 exists() 仍然 运行 一个 SQL 查询就像 $book->author 一样,但是该查询比实际获取数据并创建相应的模型更有效.

另一方面,在许多情况下,性能改进可以忽略不计,因此您只需 运行 isset($book->author) 就可以了。

我已将此方法添加到需要链接的模型中 (在我的例子中是多对多关系):

/**
 * @inheritdoc
 */
 public function link($name, $model, $extraColumns = [])
 {
     $exists = $this->getJunctionModel()
         ->where(['other_model_id' => $model->primaryKey])
         ->exists();

     if (!$exists) {
         parent::link($name, $model, $extraColumns);
     }
 }

考虑使用 $model->isRelationPopulated($relationString)