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