Database Yii2在链关系的最后一个中添加条件

Database Yii2在链关系的最后一个中添加条件,database,yii2,Database,Yii2,现在我有: $products = Product::findAll([1,2,3,4]); foreach ($products as $product){ $text = $product->part->type->texts; } 这将返回文本表中的相关记录 但我只需要从中获得一条记录,要做到这一点,我需要在最后一个jointype->text中再增加一个条件,这在模型中没有定义。它是动态会话变量 有什么方法可以做到这一点吗?如果您想修改最后一个关系查询,使其具

现在我有:

$products = Product::findAll([1,2,3,4]);
foreach ($products as $product){
    $text = $product->part->type->texts;
}
这将返回
文本
表中的相关记录

但我只需要从中获得一条记录,要做到这一点,我需要在最后一个join
type->text
中再增加一个条件,这在模型中没有定义。它是动态会话变量


有什么方法可以做到这一点吗?

如果您想修改最后一个关系查询,使其具有附加条件,并返回一条记录而不是多条记录,只需更改最后一个关系调用,如下所示:

$text = $product->part->type->getTexts()->andWhere(...)->one();
直接关系方法调用返回
yii\db\ActiveQuery
实例,以便您可以根据需要修改条件

如果要在多个位置使用修改后的关系,请为其创建单独的方法:

/**
 * @return yii\db\ActiveQuery
 */
public function getDynamicText()
{
    // Insert link from texts relation similar as in hasMany() and additional condition in andWhere()
    return $this->hasOne(...)->andWhere(...);
}
然后使用它:

$text = $product->part->type->dynamicText;
在这种情况下,这将是一个方便的解决方案,特别是如果您要使用复杂的条件

1。首先创建一个模型,该模型扩展了
ActiveQuery
,并使用一种方法将条件添加到查询中,例如
active=1

namespace app\models;

use yii\db\ActiveQuery;

class TextQuery extends ActiveQuery
{
    public function active($state = 1)
    {
        $this->andWhere(['active' => $state]); // or any other condition
        return $this;
    }
}
2.覆盖
Text
模型中的
find()
方法:

public static function find()
{
    return new \app\models\TextQuery(get_called_class());
}
3.在您的
模型中添加一个方法,通过新创建的作用域检索您的关系数据:

public function getActiveText()
{
    return $this->hasMany(Text::className(), ['type_id' => 'id'])->active();
}
最后,按如下方式使用它:

$text = $product->part->type->activeText;
这些文件都很清楚,看看吧