Как правильно сохранить через модель данные с чекбокса?

Доброй ночи всем.

Схема такая у меня есть таблица profile, category, profile_has_category.

profile
id | user_id | category_id | ... | ...

category
id | parent_id | title | ... | ...

profile_has_category
id | user_id | category_id | ...

Юзер выбирает себе категории(ю), то что он выбрал должно сохранить в таблицу profile_has_category, потом я получаю id от profile_has_category и сохраняю в profile: category_id

model
public function updateProfile()
    {
        $id = Yii::$app->user->id;
        $profile = ($profile = Profile::findOne(['user_id' => $id])) ? $profile : new Profile();
        $profile->user_id = Yii::$app->user->id;
        
         ....
         // не могу принять post в моделе 
         if (Yii::$app->request->isPost) {
            VarDumper::dump(Yii::$app->request->post(), 11, 1);
            die;
        }

        return $profile->save() ? true : false;
    }


controller

public function actionProfile()
    {
        $id = Yii::$app->user->id;
        $model = ($model = Profile::findOne(['user_id' => $id])) ? $model : new Profile();
        $weeks = Profile::weeks();
        $workGraph = WorkSchedule::workGraph();
        $gallery = Profile::getGallery();
        $tree = $model->getAllCategories();

        if (Yii::$app->request->isPost) {

         // в контроллере я вижу post, но 


$categories = Yii::$app->request->post('category')
foreach ($categories as $category){

// но когда так делаю то получаю, такой результат: 245, а я выделил три чекбокса 245, 285, 320

            VarDumper::dump(Yii::$app->request->post($categories), 11, 1);
            die;
}
            if ($model->load(Yii::$app->request->post())) {

                $model->gallery = UploadedFile::getInstances($model, 'gallery');
                if ($model->updateProfile()) {
                    Yii::$app->session->setFlash('success', 'Профиль изменен!');
                    return $this->refresh();
                } else {
                    Yii::$app->session->setFlash('error', 'Профиль не изменен!');
                    Yii::error('Ошибка записи. Профиль не изменен!');
                    return $this->refresh();
                }
            }
        }

        return $this->render('profile', [
            'model' => $model,
            'weeks' => $weeks,
            'workGraph' => $workGraph,
            'gallery' => $gallery,
            'tree' => $tree,
        ]);
    }


view
$form = ActiveForm::begin();
foreach ($tree as $cat) {
    echo '<div class="spoiler-title ">' . $cat['title'] . '</div>';
    echo '<div class="spoiler-body">';
    if ($cat['childs'] > 0) {
        foreach ($cat['childs'] as $childs) {
            if (empty($childs['childs'])) {
                echo Html::checkbox('category[]', false, ['value' => $childs['id'], 'label' => $childs['title']]) . '<br>';
            } else {
                echo '<b><br/>' . $childs['title'] . '</b><br/>';
            }
            foreach ($childs['childs'] as $child) {
                echo Html::checkbox('category[]', false, ['value' => $child['id'], 'label' => $child['title']]) . '<br>';
            }
        }
    }
    echo '</div>';
}

echo Html::submitButton('Сохранить', ['class' => 'btn btn-success']);

$form = ActiveForm::end();


var_dump
[
    '_csrf' => 'ZTROVV8ta1IneQstDV4/ZhxWLDg0axoNVmI.Ni1sWQUQRQpmL14aPQ=='
    'category' => [
        0 => '262'
        1 => '264'
        2 => '265'
    ]
]


262, 264, 265 - это id категории. Помогите как правильно сохранить!
  • Вопрос задан
  • 106 просмотров
Решения вопроса 2
slo_nik
@slo_nik Куратор тега Yii
Доброй ночи.
В цикле, foreach().
Сначала валидируете, потом используете save() с параметром false.
Примерно так
foreach ($values as $value) {
            $value->product_id = $model->id;
            if ($value->validate()) {
                if (!empty($value->value)) {
                    $value->save(false);
                } else {
                    $value->delete();
                }
            }
        }
Ответ написан
proudmore
@proudmore
В rules модели
[['category_id'], 'required'],
[['category_id'], 'integer']
в контроллере
$categories = Yii::$app->request->post('category')
foreach ($categories as $category){
    $model = new ClassName(['category_id' => $category]);
    $model->save()
}

Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
Uman
@Uman Автор вопроса
PHP, YII2
Спасибо что показали направление я понял как мне надо было делать
foreach ($category as $k => $category_id) {
                $profileHasCategory = ($profileHasCategory = ProfileHasCategory::find()->where(['user_id' => $user_id])->andWhere(['category_id' => $category_id])->one()) ? $profileHasCategory : new ProfileHasCategory();
                $profileHasCategory->user_id = $user_id;
                $profileHasCategory->category_id = $category_id;
                $profileHasCategory->save(false);
            }
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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