4

我有两个通过连接表相关的模型。

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

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

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

问题是:

有没有一种简单的方法来执行这个检查,使用一些 yii 内置方法?

4

4 回答 4

4

ActiveQueryexists()做你需要的方法。假设您有一个Book链接到类的Author类。Book方法也是如此getAuthor()。以下是您如何确定相关记录是否存在:

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

请注意,它$book->author返回一个实例Author(如果它是一个hasMany关系,则返回一个数组),而getAuthor()返回一个ActiveQuery实例。

Executingexists()仍然像以前一样运行一个 SQL 查询$book->author,但该查询比实际获取数据和创建相应的模型更有效。

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

于 2015-11-06T22:18:57.937 回答
2

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

于 2015-11-06T20:12:13.203 回答
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);
     }
 }
于 2016-12-18T15:08:49.673 回答
0

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

于 2020-09-21T13:58:31.603 回答