Связь по двум полям.

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
kmv
Сообщения: 4
Зарегистрирован: 2020.06.05, 13:03

Связь по двум полям.

Сообщение kmv »

Здравствуйте! Подскажите пожалуйста по такой ситуации

Есть модели А и B. Таблица В является по сути промежуточной но не суть и хранит еще другие связи.

В таблице `tableB`ссылка на строку из таблицы А записывается с помощью двух полей ref_table_id и ref_rec_id.

По факту таблица Б выглядит так

Код: Выделить всё

    

id	|	ref_table_id	|	ref_rec_id
------------------------------------------------------
1	| 	tableA		|	23
где 23 - id записи из таблицы А.

В модели А прописываю Отношение:

Код: Выделить всё

    
    class A extends BaseActiveRecord
   .....
    public function getBs(): ActiveQuery
    {
        return $this->hasMany(B::class, [
            'ref_rec_id' => 'id',
            'ref_table_id' => "'".self::tableName()."'"
            ]
        );
    }
И ожидаю, что в запросе будет что-то вроде

Код: Выделить всё


LEFT JOIN tableB
ON tableB.ref_rec_id = tableA.id AND tableB.ref_table_id = 'tableA' 

Но, второе условие yii транслирует в колонки и прописывает

Код: Выделить всё

LEFT JOIN tableB
ON tableB.ref_rec_id = tableA.id AND tableA.`tableA` = tableA.`ref_table_id`
Т.е. как прописать строкове фактическое значение при описании Отношения?
'ref_table_id' => 'value'
и что бы yii не преобразовывал это как колонки присоединяемых таблиц.
kmv
Сообщения: 4
Зарегистрирован: 2020.06.05, 13:03

Re: Связь по двум полям.

Сообщение kmv »

Все оказалось просто:

Код: Выделить всё

class A extends BaseActiveRecord
   .....
    public function getBs(): ActiveQuery
    {
        return $this->hasMany(B::class, [
            'ref_rec_id' => 'id',
       ])
       ->addOnCondition(new \yii\db\Expression(B::tableName().".ref_table_id = '".self::tableName()."'"));
}
Prooksius
Сообщения: 100
Зарегистрирован: 2019.01.17, 23:24

Re: Связь по двум полям.

Сообщение Prooksius »

Может так как-то попробовать?

Код: Выделить всё

public function getBs(): ActiveQuery
    {
        return $this->hasMany(B::class, ['ref_rec_id' => 'id'])
        	->where(['ref_table_id' => "'".self::tableName()."'"]);
    }
unknownby
Сообщения: 749
Зарегистрирован: 2019.11.05, 16:34
Контактная информация:

Re: Связь по двум полям.

Сообщение unknownby »

Prooksius писал(а): 2020.06.10, 22:35 Может так как-то попробовать?

Код: Выделить всё

public function getBs(): ActiveQuery
    {
        return $this->hasMany(B::class, ['ref_rec_id' => 'id'])
        	->where(['ref_table_id' => "'".self::tableName()."'"]);
    }
В его случае запишет к LEFT JOIN условие, а если записать через where, то запишется условие к общему запросу.
Ответить