dropDownList с выбором из значений, которых нет в другой таблице

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
Rabijko
Сообщения: 22
Зарегистрирован: 2018.04.19, 14:59

dropDownList с выбором из значений, которых нет в другой таблице

Сообщение Rabijko »

Помогите сформировать список dropDownList с выбором из значений, которых нет в другой таблице + 1, если он уже назначен на данный id. Нужно вывести всех пользователей, которые не привязаны к другой таблице.
Так получается вывести всех пользователей, которые есть в таблице

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

 
 <?=$form->field($model, 'user_id', 
 	dropDownList( 
            ArrayHelper::map(
                User::find()->orderBy('username')->where( ['in', 'id',Tablname::find()->select('user_id')->column() ] ) ->all()
                , 'id', 'username'),
            [
                $model->user_id => ['selected' => true],
                'maxlength' => true,
                'options' => array('AT'=>array('selected'=>true) ),
            ]
        ) ?>
Но если добавляю вместо 'in' - 'not in' то, список пуст (хотя в базе явно видно, что там есть подходящие значения).
Так выдаёт просто нужный пользователь:

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

 ->where( ['id' => $model->user_id] ) ->all() 
И как потом добавить or, чтобы учесть этого пользователя, который выбран?
andku83
Сообщения: 988
Зарегистрирован: 2016.07.01, 10:24
Откуда: Харьков

Re: dropDownList с выбором из значений, которых нет в другой таблице

Сообщение andku83 »

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

<?= $form->field($model, 'user_id')
        ->dropDownList(
            User::find()->orderBy('username')
                ->select(['username', 'id'])->indexBy('id')
                ->andWhere(['OR',
                    ['not in', 'id', Tablname::find()->select('user_id')],
                    ['id' => $current_user_id]
                ])
                ->column()
        ) ?>
а текущее выбранное значение ActiveForm сама подставит
Rabijko
Сообщения: 22
Зарегистрирован: 2018.04.19, 14:59

Re: dropDownList с выбором из значений, которых нет в другой таблице

Сообщение Rabijko »

andku83 писал(а): 2018.05.24, 21:15

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

<?= $form->field($model, 'user_id')
        ->dropDownList(
            User::find()->orderBy('username')
                ->select(['username', 'id'])->indexBy('id')
                ->andWhere(['OR',
                    ['not in', 'id', Tablname::find()->select('user_id')],
                    ['id' => $current_user_id]
                ])
                ->column()
        ) ?>
а текущее выбранное значение ActiveForm сама подставит
Фокус в том, что такой код с "in" работает нормально, а "not in" не работает...
andku83
Сообщения: 988
Зарегистрирован: 2016.07.01, 10:24
Откуда: Харьков

Re: dropDownList с выбором из значений, которых нет в другой таблице

Сообщение andku83 »

Rabijko писал(а): 2018.05.26, 17:01 Фокус в том, что такой код с "in" работает нормально, а "not in" не работает...
И как же вы это определили?
Смотрите запрос в дебагере и если на то уж пошло, то покажите свой sql запрос который вы хотите получить и он работает
Rabijko
Сообщения: 22
Зарегистрирован: 2018.04.19, 14:59

Re: dropDownList с выбором из значений, которых нет в другой таблице

Сообщение Rabijko »

andku83 писал(а): 2018.05.27, 04:09
Rabijko писал(а): 2018.05.26, 17:01 Фокус в том, что такой код с "in" работает нормально, а "not in" не работает...
И как же вы это определили?
Смотрите запрос в дебагере и если на то уж пошло, то покажите свой sql запрос который вы хотите получить и он работает
В MySQL рабочий запрос:

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

 select * from user where id not in (select ifnull (user_id,0) from tablename) 
или

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

 select * from user left join tablename on tablename.user_id=user.id where user_id is null 
Как это теперь адаптировать в dropDownList ?
andku83
Сообщения: 988
Зарегистрирован: 2016.07.01, 10:24
Откуда: Харьков

Re: dropDownList с выбором из значений, которых нет в другой таблице

Сообщение andku83 »

первый:

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

            User::find()
                ->andWhere(['not in', 'id', Tablname::find()->select(['user_id' => new \yii\db\Expression("ifnull (user_id,0)")])])
                ->all()
второй:

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

            User::find()
                ->leftJoin('tablename', 'tablename.user_id=user.id') // если есть связь то можно ->joinWith('tablename')
                ->andWhere(['IS', 'user_id', NULL])
                ->all()
Rabijko
Сообщения: 22
Зарегистрирован: 2018.04.19, 14:59

Re: dropDownList с выбором из значений, которых нет в другой таблице

Сообщение Rabijko »

andku83 писал(а): 2018.05.29, 12:32 первый:

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

            User::find()
                ->andWhere(['not in', 'id', Tablname::find()->select(['user_id' => new \yii\db\Expression("ifnull (user_id,0)")])])
                ->all()
второй:

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

            User::find()
                ->leftJoin('tablename', 'tablename.user_id=user.id') // если есть связь то можно ->joinWith('tablename')
                ->andWhere(['IS', 'user_id', NULL])
                ->all()
Большое спасибо, получилось! Сделал так:

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

  
->dropDownList( 
            ArrayHelper::map( User::find() ->where( 
                   ['OR', 
                   	['not in', 'id', Tablename::find()->select(["(ifnull (user_id,0))"])],
                   	['id' => $model->user_id] ]
                   )->orderBy('username') ->all(), 'id', 'username'),
andku83
Сообщения: 988
Зарегистрирован: 2016.07.01, 10:24
Откуда: Харьков

Re: dropDownList с выбором из значений, которых нет в другой таблице

Сообщение andku83 »

выше писал вариант без ArrayHelper:: map:

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

User::find()->where( 
                   ['OR', 
                   	['not in', 'id', Tablename::find()->select(["(ifnull (user_id,0))"])],
                   	['id' => $model->user_id] ]
                   )->orderBy('username')
                   ->select(['username', 'id'])->indexBy('id')
                   ->column()
                
возвращает готовый массив и при этом не получает лишних данных из БД
Ответить