Yii2 сохранение многие-ко-многим в одной модели
1. Подготовим вывод параметров
\views\pers\_form.php
2.Функции в модели
\models\Pers.php
3. Контролер
\controllers\PersController.php
4. Удаление из сводной таблицы будет происходить за счет внешних ключей
DDL pers_param
5. Настроим GridView
и в модели
6. DetailView
_
\views\pers\_form.php
<?php if ($model->isNewRecord) { $result = $model->inputAtr(); } else { $result = $model->updAtr($model->id); }; ?> <?php for($i = 0; $i < count($result); $i++) { (!empty ($result[$i]['value'])) ? $value = $result[$i]['value'] : $value = 10; ?> <p> <?= $result[$i]['name']; ?></p> <input type="number" min="1" max="100" step="1" value="<?= $value; ?>" name="Param[<?= $result[$i]['id']; ?>]" class='form-control'> <?php } ?>
2.Функции в модели
\models\Pers.php
public function inputAtr() { $connection = Yii::$app->getDb(); $command = $connection->createCommand(" SELECT id, name FROM param p WHERE p.id != p.param_id AND p.param_id = 1 "); $result = $command->queryAll(); return $result; } public function updAtr($pers) { $connection = Yii::$app->getDb(); $command = $connection->createCommand(" SELECT p.id, p.name, p.info, p.param_id, pp.value FROM param p LEFT JOIN pers_param pp ON (pp.param_id = p.id AND pp.pers_id = $pers) WHERE p.param_id = 1 AND p.id != p.param_id "); $result = $command->queryAll(); return $result; }
3. Контролер
\controllers\PersController.php
public function actionCreate() { $model = new Pers(); $model->loadDefaultValues(); if ($model->load(Yii::$app->request->post()) && $model->save()) { $last_id = $model->id; $param = Yii::$app->request->post('Param'); $connection = \Yii::$app->db; foreach($param as $id => $value) { $connection->createCommand() ->insert('pers_param', [ 'pers_id' => $last_id, 'param_id' => $id, 'value' => $value ])->execute(); } return $this->redirect(['view', 'id' => $last_id]); } return $this->render('create', [ 'model' => $model, ]); } /** * Updates an existing Pers model. * If update is successful, the browser will be redirected to the 'view' page. * @param integer $id * @return mixed */ public function actionUpdate($id) { $model = $this->findModel($id); if ($model->load(Yii::$app->request->post()) && $model->save()) { $param = Yii::$app->request->post('Param'); $connection = \Yii::$app->db; foreach($param as $id_param => $value) { $command = $connection->createCommand( "INSERT INTO pers_param (pers_id, param_id, value) VALUE ( $id, $id_param, $value) ON DUPLICATE KEY UPDATE value = $value;"); $command->execute(); } return $this->redirect(['view', 'id' => $model->id]); } return $this->render('update', [ 'model' => $model, ]); }
4. Удаление из сводной таблицы будет происходить за счет внешних ключей
DDL pers_param
CREATE TABLE `pers_param` ( `id` INTEGER(11) NOT NULL AUTO_INCREMENT, `pers_id` INTEGER(11) NOT NULL COMMENT 'персонаж', `param_id` INTEGER(11) NOT NULL COMMENT 'параметр', `value` INTEGER(11) NOT NULL DEFAULT 1 COMMENT 'значение', `f_time` TIMESTAMP(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6) ON UPDATE CURRENT_TIMESTAMP(6) COMMENT 'создано', PRIMARY KEY (`id`) USING BTREE, UNIQUE KEY `pers_param_idx1` (`pers_id`, `param_id`) USING BTREE, KEY `fk_pers_has_param_param2_idx` (`param_id`) USING BTREE, KEY `fk_pers_has_param_pers2_idx` (`pers_id`) USING BTREE, CONSTRAINT `fk_pers_has_param_param2` FOREIGN KEY (`param_id`) REFERENCES `param` (`id`) ON DELETE CASCADE ON UPDATE CASCADE, CONSTRAINT `fk_pers_has_param_pers2` FOREIGN KEY (`pers_id`) REFERENCES `pers` (`id`) ON DELETE CASCADE ON UPDATE CASCADE ) ENGINE=InnoDB AUTO_INCREMENT=47 CHARACTER SET 'utf8' COLLATE 'utf8_unicode_ci' COMMENT='базовые параметры персонажа' ;
5. Настроим GridView
<?php $model = new Pers(); $result = $model->inputAtr(); //получаем список атрибутов $column = [ ['class' => 'yii\grid\SerialColumn'], 'id', 'name:ntext', 'info:ntext', 'img:ntext', 'lvl', ]; for($i = 0; $i < count($result); $i++) { $res = $result[$i]['id']; $myparam = [ 'attribute' => $result[$i]['name'], 'format' => 'raw', 'value' => function ($model) use ($res) { return $model->myval($model->id, $res); //добавляем свои данные }, ]; $column[] = $myparam; } $column[] = ['class' => 'yii\grid\ActionColumn']; ?> <?= GridView::widget([ 'dataProvider' => $dataProvider, 'filterModel' => $searchModel, 'columns' => $column, ]); ?>
и в модели
public function myval($id_pers, $id_param) { $model = Pparam::find('value') ->where(['pers_id' => $id_pers, 'param_id' => $id_param]) ->scalar(); return $model; }
6. DetailView
<?php $model_ = new Pers(); $result = $model_->inputAtr(); $column = [ 'id', 'name:ntext', 'info:ntext', 'img:ntext', 'lvl', 'lvlup', 'exp', 'race_id' ]; for($i = 0; $i < count($result); $i++) { $res = $result[$i]['id']; $myparam = [ 'label' => $result[$i]['name'], 'value' => $model->myval($model->id, $res), ]; $column[] = $myparam; } ?> <?= DetailView::widget([ 'model' => $model, 'attributes' => $column, ]); ?>
_
Комментарии
Отправить комментарий