Serggalas
@Serggalas
Учусь

Почему так сохраняется в базе?

есть таблица Product с одним из столбцов tied предполагается что туда будут заносится связаные товары вот таким образом установлено его заполнение в виде
<?php 
        $product=Product::find()->where('category_id='.$cat->id)->all();
                foreach($product as $prod){ ?>
                    <?= $form->field($model, 'tied['.$prod->title.']')->checkbox(['value' => $prod->title, 'label' => $prod->title])
                    }
            ?>

вот часть экшена который отвечает за сохранение в базу
if ($model->load(Yii::$app->request->post())) {
                $post=Yii::$app->request->post();
                foreach($post ["Product"]["tied"] as $tied){
                    $model->tied .=$tied."%";
                }
                $model->save();
           }

Но почемуто в базу значения не перезаписываются и добавлеются. Не подскажите почему и как с этим бороться?
  • Вопрос задан
  • 120 просмотров
Пригласить эксперта
Ответы на вопрос 1
Я так понимаю, что у вас один класс используется т.е. только Продукт?
Если да, то массовая работа и обновления проводятся так.

В контроллере:
public function actionUpdate()
    {
        // Тут получаете свой cat либо передаете каким либо образом. 
        $products = Product::find()->where('category_id'= $cat->id)->indexBy('id')->all();

        if (Model::loadMultiple($products, Yii::$app->request->post()) && Model::validateMultiple($products)) {
            foreach ($products as $product) {
                $product->save(false);
            }
            return $this->redirect('index');
        }
        return $this->render('update', ['products' => $products]);
    }


В виде
$form = ActiveForm::begin();

foreach ($products as $index => $product) {
    echo $form->field($product, "[$index]value")->checkbox(['value' => $prod->title, 'label' => $prod->title]);
}

ActiveForm::end();


Если вы используете не одну модель и связанные вещи т.е. к пример как User и Profile, то вам нужна Работа с несколькими моделями

К тому же, если вы работаете со свзями, можно использовать жадную загрузку. подгружая и связи таким образом
//получаете продукты и связи за один запрос.
$products = Product::find()->with('category', 'someTied')->all();

//или с условием
$products = Product::find()->with([
    'categpry' => function ($query) {
        $query->andWhere(['category_id' => 15]);
    },
])->all();


Если вам нужно сохранить или обновить именно связные Id у разных объектов, есть метод link.
Ответ написан
Ваш ответ на вопрос

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

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