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