首页 > 解决方案 > 使用关系通过和比较运算符时,Yii2 对父模型表的别名

问题描述

我有 Yii2 关系

模型变体(简化)

变体 hasOne 参考序列

public function getReferenceSequence()
{
    return $this->hasOne(ReferenceSequences::className(), ['id' => 'reference_sequence_id'])->alias('referenceSequence');
} 

Variants hasMany Annotations 通过 ReferenceSequence

我想使用比较运算符加入基于模型属性“开始”和“结束”(整数值)的注释。

这不起作用

public function getAnnotations()
    {
        return $this->hasMany(Annotations::className(), ['chrom' => 'name'])
            ->via('referenceSequence')
            ->andOnCondition(['AND',['>=','tx_start',$this->start],['<=','tx_start',$this->end]])
            ->alias('annotations');
    } 

我正在寻找具有相同染色体但也在变体模型的开始/结束范围内的注释。

我没有尝试注入模型属性 $this->start 和 $this->end 这由于某种原因只会导致使用一对值,而不是每个搜索结果模型都加入 $this 对象的属性,而是想要使用父表的别名。

'on' 条件应该是这样的:

->andOnCondition(['AND',['>=','tx_start','VARIANTS_MODEL_ALIAS.start],['<=','tx_start',VARIANTS_MODEL_ALIAS.end]])

在 Yii1 中有一个神奇的“t”别名,但这不再起作用了。

标签: activerecordyii2relation

解决方案


诸如此类的条件->andOnCondition(['AND',['>=','tx_start',$this->start],['<=','tx_start',$this->end]])仅适用于延迟加载,因为$this将引用运行此查询的当前模型。如果您确实Variants::find()查询是从空模型运行的,那么start并且end将始终为空(或具有默认值)。

如果你想让这种关系发挥作用,你可以尝试这样的事情:

public static function find() {
    return parent::find()->alias('variants');
}

public function getAnnotations() {
    return $this->hasMany(Annotations::className(), ['chrom' => 'name'])
        ->via('referenceSequence')
        ->andOnCondition([
            'AND',
            ['>=', 'tx_start', new Expression('variants.start')],
            ['<=', 'tx_start', new Expression('variants.end')],
        ])
        ->alias('annotations');
}

public function getReferenceSequence() {
    return $this->hasOne(ReferenceSequences::className(), ['id' => 'reference_sequence_id'])
        ->alias('referenceSequence');
}

Variant::find()->joinWith('annotations')->all()这可能适用于连接(如这个答案或更改您的数据库架构以简化整个问题。


推荐阅读