使用通过和比较运算符之间的关系时,父模型表的Yii2别名

时间:2019-06-02 05:22:27

标签: activerecord yii2 relation

我有Yii2关系

模型变体(简体)

变体有一个参考序列

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

变量通过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');
    } 

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

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

“开启”状态应类似于:

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

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

1 个答案:

答案 0 :(得分:0)

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

如果您想使这种关系正常运行,您可以尝试以下方法:

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(),但是您将无法使用此关系进行延迟加载,并且很可能甚至无法使用此关系来获取注释。这种情况很棘手,您可能需要使用this answer中的技巧或更改数据库架构以简化整个问题。