Псевдоним Yii2 к таблице родительской модели при использовании отношений через и операторов сравнения - PullRequest
0 голосов
/ 02 июня 2019

У меня есть отношения Yii2

Варианты модели (упрощенно)

Варианты ссылочной последовательности hasOne

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

Варианты hasMany аннотации через ReferenceSequence

Я хочуобъединить аннотации на основе свойств модели 'start' и 'end' (целочисленные значения) с помощью операторов сравнения.

ЭТО НЕ РАБОТАЕТ

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объект, я хочу использовать псевдоним для родительской таблицы.

Условие 'on' должно быть примерно таким:

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

В Yii1 был магический псевдоним "t", но этотбольше не работает.

1 Ответ

0 голосов
/ 02 июня 2019

Условия типа ->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(), но вы не сможете использовать этоотношение для отложенной загрузки, и, скорее всего, вы не сможете даже извлечь аннотации, используя это отношение. В этом случае сложно, вам может понадобиться использовать трюк из этого ответа или изменить схему БД, чтобы упростить всюпроблема.

...