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

时间:2015-02-18 17:11:03

标签: database yii2

现在我有:

$products = Product::findAll([1,2,3,4]);
foreach ($products as $product){
    $text = $product->part->type->texts;
}

这将返回Texts表格中的相关记录。

但是我需要只有1条记录,为此我需要在最后一次加入type->texts中再生一个条件,这在模型中没有定义。它是动态会话变量。

有没有办法做到这一点?

2 个答案:

答案 0 :(得分:10)

如果要修改最后一个关系查询以获得附加条件并返回一条记录而不是多条记录,只需更改上一次关系调用:

$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 :(得分:3)

在这种情况下,scopes将是一个方便的解决方案,特别是如果您要使用复杂的条件。

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。覆盖find()模型中的Text方法:

public static function find()
{
    return new \app\models\TextQuery(get_called_class());
}

3. Type模型中添加一个方法,通过新制作的范围检索关系数据:

public function getActiveText()
{
    return $this->hasMany(Text::className(), ['type_id' => 'id'])->active();
}

最后,按如下方式使用:

$text = $product->part->type->activeText;

文档非常明确,请查看。