Связь с аналогичной таблицей второй раз и поиск в ней

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
iamguruman
Сообщения: 236
Зарегистрирован: 2018.05.10, 08:26

Связь с аналогичной таблицей второй раз и поиск в ней

Сообщение iamguruman »

В модели у меня есть две связи:

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

    /**
     * связка с транспортник 1
     * @return \yii\db\ActiveQuery
     */
    public function getTransporter()
    {
        return $this->hasOne(Transporter::className(), ['id' => 'transporter_id']);
    }

    /**
     * связка с транспортник 2
     * @return \yii\db\ActiveQuery
     */
    public function getTransporter2()
    {
        return $this->hasOne(Transporter::className(), ['id' => 'transporter_id_2']);
    }
    
Эти обе связи идут на одну модель Transporter, в одну таблицу приходят оба запроса по факту, таблица называется m_transporters__transporter

во вьюшке делаю вывод и через аттрибьют указываю поиск:

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

[
                'label' => 'Транспортник',
                'attribute' => 'transporterNameSearch',
                'format' => 'raw',
                'value' => function($model){
                    $ret = [];

                    if($model->transporter){
                        $ret [] = $model->transporter->urlTo;
                    }

                    if($model->transporter2){
                        $ret [] = $model->transporter2->urlTo;
                    }

                    return implode("<br>", $ret);

                }
            ],
            
вот поиск в ModelSearch и мой вопрос:

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

       
        if($this->transporterNameSearch){
            $query
                ->joinWith('transporter')
                ->joinWith('transporter2')
                ->andWhere(['like' , 'm_transporters__transporter.name', $this->transporterNameSearch])
                ->andWhere(['like' , 'm_transporters__transporter.name', $this->transporterNameSearch]); // как тут указать связь с transporter2?
                ;
            
        }
        
В поиске я указал два раза joinWinth и два раза будет джоин таблицы с транспортниками (Transporter)

Я не понимаю как указать обращение к таблице m_transporters__transporter... ведь надо два раза задействовать одну таблицу в разных связях и в одном запросе
unknownby
Сообщения: 749
Зарегистрирован: 2019.11.05, 16:34
Контактная информация:

Re: Связь с аналогичной таблицей второй раз и поиск в ней

Сообщение unknownby »

Используй алиасы в джоинах и будет тебе счастье

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

if($this->transporterNameSearch){
            $query
                ->joinWith('transporter a')
                ->joinWith('transporter2 b')
                ->andWhere(['like' , 'a.name', $this->transporterNameSearch])
                ->andWhere(['like' , 'b.name', $this->transporterNameSearch]); // как тут указать связь с transporter2?
                ;
            
        }
Ответить