@MikMik

Как организовать поиск двух значений из одного поля?

В view In требуется организовать поиск по таблице dancer в двух колонках GridView dancerId1 и dancerId2

5a40d46533bcd606143903.png

В search-модели:
class InSearch extends In
{
    public $couple_nomer;
    public $dancerId1;
    public $dancerId2;
    
    public function rules()
    {
        return [      
            [['couple_nomer', 'dancerId1', 'dancerId2'], 'safe'],
        ];
    }

    public function search($params)
    {
        $query = In::find()->joinWith(['couple', 'tur', 'couple.dancerId1']);

        $dataProvider = new ActiveDataProvider([
            'query' => $query,
        ]);

        $this->load($params);

        if (!$this->validate()) {
            return $dataProvider;
        }

        $query
            ->andFilterWhere(['like', 'couple.nomer', $this->couple_nomer])
            ->andFilterWhere(['like', 'couple.dancerId1.sname', $this->dancerId1])
            ->andFilterWhere(['like', 'couple.dancerId1.sname', $this->dancerId2]);    

        return $dataProvider;
    }
}


В принципе работает, но ищет только в dancerId1. Понимаю, что видимо надо приджойнить второй экземпляр через алиас, но как это сделать не догоняю.
  • Вопрос задан
  • 54 просмотра
Решения вопроса 2
slo_nik
@slo_nik Куратор тега Yii
Доброе утро.
Используйте второй joinWith() и назначьте псевдоним для таблицы.
Как-то так:
$query = In::find()
       ->joinWith(['couple' => function(ActiveQuery $query){
                            $query->from(['c1' => Couple::tableName()])
                        }])
       ->joinWith(['couple' => function(ActiveQuery $query){
                               $query->from(['c2' => Couple::tableName()])
                         }]);

Использовать потом можно так:
$query
            ->andFilterWhere(['like', 'couple.nomer', $this->couple_nomer])
            ->andFilterWhere(['like', 'c1.dancerId1.sname', $this->dancerId1])
            ->andFilterWhere(['like', 'c2.dancerId2.sname', $this->dancerId2]);

Вот только я не до конца понял что это за sname.
И в
->joinWith(['couple' => function(ActiveQuery $query){
замените "couple" на имя связи
Ответ написан
@MikMik Автор вопроса
Разобрался!
public function search($params)
    {
        $query = In::find()
            ->joinWith(['couple', 'tur'])
            ->joinWith(['couple.dancerId1'=> function($q){
                                $q->from('dancer c1');
                            }])
            ->joinWith(['couple.dancerId2'=> function($q){
                                $q->from('dancer c2');
                            }]);
            

        $dataProvider = new ActiveDataProvider([
            'query' => $query,
        ]);

        $this->load($params);

        if (!$this->validate()) {
            return $dataProvider;
        }

        $query
            ->andFilterWhere(['like', 'couple.nomer', $this->couple_nomer])
            ->andFilterWhere(['like', 'c1.sname', $this->dancerId1])
            ->andFilterWhere(['like', 'c2.sname', $this->dancerId2]);    
        

        return $dataProvider;
    }


Спасибо slo_nik !
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы