Yii 2 связь многие-ко-многим
основная статья
нужно установить дополнение
(если не понятно - пишите в комментах)
\yii2basic\composer.json
DDL таблиц
unit
perk
unit_has_perk
view \yii2basic\modules\person\views\unit\_form.php
public function getPerks()
{
return $this->hasMany(Perk::className(), ['id' => 'perk_id'])
->viaTable('pers_has_perk', ['pers_id' => 'id']);
}
public function behaviors()
{
return [
[
'class' => \voskobovich\behaviors\ManyToManyBehavior::className(),
'relations' => [
'perks_list' => 'perks',
],
],
];
}
\yii2basic\modules\person\views\unit\index.php
F:\OpenServer\domains\yii2basic\modules\person\views\unit\view.php
нужно установить дополнение
(если не понятно - пишите в комментах)
\yii2basic\composer.json
{ "name": "yiisoft/yii2-app-basic", "description": "Yii 2 Basic Project Template", "keywords": ["yii2", "framework", "basic", "project template"], "homepage": "http://www.yiiframework.com/", "type": "project", "license": "BSD-3-Clause", "support": { "issues": "https://github.com/yiisoft/yii2/issues?state=open", "forum": "http://www.yiiframework.com/forum/", "wiki": "http://www.yiiframework.com/wiki/", "irc": "irc://irc.freenode.net/yii", "source": "https://github.com/yiisoft/yii2" }, "minimum-stability": "stable", "require": { "php": ">=5.4.0", "yiisoft/yii2": ">=2.0.5", "yiisoft/yii2-bootstrap": "*", "yiisoft/yii2-swiftmailer": "*", "voskobovich/yii2-many-many-behavior": "*" }, "require-dev": { "yiisoft/yii2-codeception": "*", "yiisoft/yii2-debug": "*", "yiisoft/yii2-gii": "*", "yiisoft/yii2-faker": "*" }, "config": { "process-timeout": 1800 }, "scripts": { "post-create-project-cmd": [ "yii\\composer\\Installer::postCreateProject" ] }, "extra": { "yii\\composer\\Installer::postCreateProject": { "setPermission": [ { "runtime": "0777", "web/assets": "0777", "yii": "0755" } ], "generateCookieValidationKey": [ "config/web.php" ] }, "asset-installer-paths": { "npm-asset-library": "vendor/npm", "bower-asset-library": "vendor/bower" } } }
public function attributeLabels() { return [ 'id' => 'id', 'name' => 'имя', 'race_id' => 'раса', 'img' => 'изображение', 'desc' => 'описание', ]; }
DDL таблиц
unit
CREATE TABLE `unit` ( `id` int(11) NOT NULL AUTO_INCREMENT COMMENT 'id', `name` tinytext NOT NULL COMMENT 'имя', `race_id` int(11) NOT NULL COMMENT 'раса', `img` tinytext NOT NULL COMMENT 'изображение', `desc` tinytext NOT NULL COMMENT 'описание', PRIMARY KEY (`id`), UNIQUE KEY `id` (`id`), KEY `race_id` (`race_id`), CONSTRAINT `unit_fk1` FOREIGN KEY (`race_id`) REFERENCES `race` (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8 PACK_KEYS=0;
perk
CREATE TABLE `perk` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(255) NOT NULL, `desc` varchar(255) NOT NULL, PRIMARY KEY (`id`), UNIQUE KEY `id_2` (`id`), KEY `id` (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;
unit_has_perk
CREATE TABLE `unit_has_perk` ( `id` int(11) NOT NULL AUTO_INCREMENT, `perk_id` int(11) NOT NULL, `unit_id` int(11) NOT NULL, PRIMARY KEY (`id`), UNIQUE KEY `id` (`id`), KEY `FK_unit_has_perk` (`perk_id`), KEY `unit_id` (`unit_id`), CONSTRAINT `unit_has_perk_fk1` FOREIGN KEY (`perk_id`) REFERENCES `perk` (`id`), CONSTRAINT `unit_has_perk_fk2` FOREIGN KEY (`unit_id`) REFERENCES `unit` (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
view \yii2basic\modules\person\views\unit\_form.php
use yii\helpers\ArrayHelper;use app\modules\person\models\Perk;
<?= $form->field($model, 'perks_list') ->dropDownList(ArrayHelper::map(Perk::find()->all(), 'id', 'name'), ['multiple' => true]) ?>model \yii2basic\modules\person\models\Unit.php
public function rules() { return [ [['name', 'race_id', 'desc'], 'required'], [['name', 'desc'], 'string'], [['race_id'], 'integer'], //[['img'], 'file', 'skipOnEmpty' => false], [['img'], 'file'], [['perks_list'], 'safe'], ]; }
public function getPerks()
{
return $this->hasMany(Perk::className(), ['id' => 'perk_id'])
->viaTable('pers_has_perk', ['pers_id' => 'id']);
}
public function behaviors()
{
return [
[
'class' => \voskobovich\behaviors\ManyToManyBehavior::className(),
'relations' => [
'perks_list' => 'perks',
],
],
];
}
public function getMyperks() { $perks = $this->perks; for($i = 0; $i <= count($perks); $i++) { if (!empty($perks[$i]['name'])) $perk[] = Html::a($perks[$i]['name'], ['/person/perk/view', 'id' => $perks[$i]['id'],], ['class' => 'btn btn-link']); } return ($perk) ? implode($perk) : ''; }
\yii2basic\modules\person\views\unit\index.php
<?php use yii\helpers\Html; use yii\grid\GridView; use yii\web\UploadedFile; use yii\helpers\ArrayHelper; use app\modules\person\models\Race; use app\modules\person\models\Unit; use yii\helpers\Url; /* @var $this yii\web\View */ /* @var $searchModel app\modules\person\models\UnitSearch */ /* @var $dataProvider yii\data\ActiveDataProvider */ $this->title = 'Units'; $this->params['breadcrumbs'][] = $this->title; ?> <div class="unit-index"> <h1><?= Html::encode($this->title) ?></h1> <?php // echo $this->render('_search', ['model' => $searchModel]); ?> <p> <?= Html::a('Create Unit', ['create'], ['class' => 'btn btn-success']) ?> </p> <?php //echo print_r($model->perks_list); ?> <?= GridView::widget([ 'dataProvider' => $dataProvider, 'filterModel' => $searchModel, 'columns' => [ [ 'class' => 'yii\grid\SerialColumn' ], //'id', [ 'format' => 'raw', 'label' => 'lol', 'value' => function($data) { return $data->myperks; }, ], //implode(",",'perks_list') , // 'img:ntext', ['attribute' => 'desc', 'filter' => false], ['class' => 'yii\grid\ActionColumn'], ], ]); ?> </div>
F:\OpenServer\domains\yii2basic\modules\person\views\unit\view.php
<?php use yii\helpers\Html; use yii\widgets\DetailView; use app\modules\person\models\Race; /* @var $this yii\web\View */ /* @var $model app\modules\person\models\Unit */ $this->title = $model->name; $this->params['breadcrumbs'][] = ['label' => 'Units', 'url' => ['index']]; $this->params['breadcrumbs'][] = $this->title; ?> <div class="unit-view"> <h1><?= Html::encode($this->title) ?></h1> <p> <?= Html::a('Update', ['update', 'id' => $model->id], ['class' => 'btn btn-primary']) ?> <?= Html::a('Delete', ['delete', 'id' => $model->id], [ 'class' => 'btn btn-danger', 'data' => [ 'confirm' => 'Are you sure you want to delete this item?', 'method' => 'post', ], ]) ?> </p> <?= DetailView::widget([ 'model' => $model, 'attributes' => [ 'id', 'name:ntext', ['label' => 'раса', 'value' => $model->race->name,], [ 'format' => 'raw', 'label' => 'lol', 'value' => $model->myperks, ], 'img:ntext', 'desc:ntext', ], ]) ?> </div>
Комментарии
Отправить комментарий