myks92
@myks92
Нашёл решение — пометь вопрос ответом!

Как правильно в модель странный массив =)?

Всем привет!))
Делаю MultipleInput у поля user_id. У меня получается такой массив

[
    'rang_id' => '1'
    'discipline_id' => '1'
    'nomination_id' => '1'
    'category_id' => '1'
    'users' => ''
    'user_id' => [
        0 => '1'
        1 => '2'
        2 => '3'
    ]
]


Подскажите как правильно сохранить такой массив чтобы прошел все возможную валидацию в rules?

public function actionCreate()
    {

        $model = new RegEvent([
            'number'=> RegEvent::setNumber(),
            'event_id' => RegEvent::getEventId()
        ]);

        $model->scenario = $model::SCENARIO_FRONTEND;

        if ($model->load(Yii::$app->request->post())) {
            if (is_array($model->user_id)){
                foreach ($model->user_id as $user_id) {
                    $model->user_id = $user_id;
                    $model->rang_id;
                    $model->save();
                }
            }
                return $this->redirect(['index']);
        }

        if (Yii::$app->request->isAjax){
            return $this->renderAjax('_form', [
                'model' => $model,
            ]);

        }

        return $this->render('create', [
            'model' => $model,
        ]);
    }
  • Вопрос задан
  • 75 просмотров
Решения вопроса 1
webinar
@webinar Куратор тега Yii
Учим yii: https://youtu.be/-WRMlGHLgRg
if (is_array($model->user_id)){
                foreach ($model->user_id as $user_id) {
                    $model->user_id = $user_id;
                    $model->rang_id;
                    $model->save();
                }
            }

Вы просто сохранили n раз модель, каждый раз меняя в ней user_id. В чем смысл? В итоге у Вас в user_id будет последний элемент массива. И что в цикле делает $model->rang_id;, он же не меняется, его в любом случае за цикл надо вынести. Вы определитесь что Вы хотите получить. Если Вам надо там хранить массив, то возможно стоит юзать json(делая его в beforeSave и обратно в afterFind), если строкой, то надо объединить массив в строку implode, возможно нужна еще 1 таблица, где будут храниться пары regEvent_id | user_id
Что именно Вам надо?
По поводу валидации массивов, есть yii\validators\EachValidator

и меня смущает
'users' => '',
'users' => [
        0 => '1'
        1 => '2'
        2 => '3'
    ]

как два одинаковых ключа получилось? К тому же пришло у Вас $users, а перебираете в цикле Вы $model->user_id, я так понимаю там должно было быть $model->users или Yii::$app->request->post('users')

В общем странный тут код, а массив вполне обычный. Думаю стоит закончить на сегодня и пойти попить чего-то. Вы же не вчерашний, а тут прям ужасть. Надо отдыхать.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

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