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。当然,这在一对一关系的情况下有效。对于一对多,您必须检查结果数组。
ActiveQuery
有 exists()
方法可以满足您的需要。假设您有一个链接到 Author
class 的 Book
class。所以 Book
有 getAuthor()
方法。查找相关记录是否存在的方法如下:
$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);
}
}
我有两个模型通过一个连接点 table 相关联。
$model->link()
是用来建立两个模型之间关系的方法。它基本上用两个模型的相应键填充连接 table。
如果 link 编辑了两个模型并且我再次尝试 link 它们,将会出现错误,因为密钥对已经存在于联结点 table 中。然后我需要在尝试 link 模型之前检查这种关系是否存在。
我想我可以为联结点创建一个模型 table 并查询正确的记录。该查询的结果将告诉我是否需要执行 link.
问题是:
是否有使用 yii 内置方法执行此检查的简短方法?
我认为最简单的方法就是调用关联方法。 使用模型 Foo 和模型 Bar getBar() 的关系方法(使用 via junction table 定义)(新 Foo)->如果没有 link,则 bar 为 null。当然,这在一对一关系的情况下有效。对于一对多,您必须检查结果数组。
ActiveQuery
有 exists()
方法可以满足您的需要。假设您有一个链接到 Author
class 的 Book
class。所以 Book
有 getAuthor()
方法。查找相关记录是否存在的方法如下:
$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);
}
}