Можно ли добавлять дополнительное поле в промежуточную таблицу используя это поведение ? Что нужно прописать в Геттерах - зеттерах?
Поясню зачем .
1-я таблица это фильмы. У одного фильма может быть несколько режиссеров. Напримеример Иванов АА, Борисов Б и Петров В , взятых из таблицы media_man.
А так же у одного фильма может быть несколько продюссеров . Тот же Иванов А.А и Петров. Они тоже взяты из таблицы media_man. Т.е в промежуточную таблицу нужен еще парамет- тип человека.
Есть вариант- сделать на каждый человека тип промежуточную таблицу- но это очень плохой вариант. Наиболее хороший- это добавить к промежуточной таблице(media_has_man) тройной ключ и поле c типом человека. Но я не уверен, что данное поведение обладает данным функционалом.
Замечу. Без дополнительного поля- поведение работает.
Код: Выделить всё
// Таблица с человеками (режиссер, продюсер и так далее.)
// таблица с фильмами
CREATE TABLE `media_product` (
`id` int(11) NOT NULL,
`name` varchar(1024) NOT NULL COMMENT 'Название фильма',
......
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
// таблица с режиссерами и продюсерами
CREATE TABLE `media_man` (
`id` int(11) NOT NULL,
`name` varchar(255) NOT NULL COMMENT 'Имя',
....
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
// промежуточная таблица для связи many many - без дополнительного поля
CREATE TABLE `media_has_man` (
`media_id` int(11) NOT NULL,
`man_id` int(11) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
ALTER TABLE `media_has_man`
ADD PRIMARY KEY (`media_id`,`man_id`) ;
Вариант 2- промежуточной таблицы с Тройным первичным ключом.
CREATE TABLE `media_has_man` (
`media_id` int(11) NOT NULL,
`man_id` int(11) NOT NULL,
`type_men` enum('PRODUCER','SCENARIST','REJISSER','TV_PRESENTER') NOT NULL COMMENT 'Тип человека(режиссер и тд)'
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
ALTER TABLE `media_has_man`
ADD PRIMARY KEY (`media_id`,`man_id` , `type_men`) ;
Код: Выделить всё
class MediaProduct extends \yii\db\ActiveRecord
{
/**
* @inheritdoc
*/
public static function tableName()
{
return 'media_product';
}
/**
* @inheritdoc
*/
public function rules()
{
return [
[['name', ...], 'required'],
.......
[['man_ids'], 'each', 'rule' => ['integer']], // поведение много- ко многим
];
}
/**
* @inheritdoc
*/
public function attributeLabels()
{
return [
'id' => 'ID',
'name' => 'Название медиа продукта',
.....
];
}
public function getMans()
{
return $this->hasMany(
MediaMan::className(),
['id' => 'man_id']
)->viaTable(
'{{%media_has_man}}',
['media_id' => 'id']
);
}
public function behaviors()
{
return [
[
'class' => \voskobovich\linker\LinkerBehavior::className(),
'relations' => [
// 'man_ids' => 'mans', // возможно связи неправильно выставлены!!!
'man_ids' => [
'mans', //совпадает с названием функции getMans();
'fields' => [
'json' => [
'get' => function($value) {
// print_r( $value);
// Array ( [0] => 1 [1] => 2 ) сюда почему то приходит массив
// die();
//from internal representation (array) to user type
return JSON::encode($value);
},
'set' => function($value) {
//from user type to internal representation (array)
return JSON::decode($value);
},
],
'string' => [
'get' => function($value) {
//from internal representation (array) to user type
return implode(',', $value);
},
'set' => function($value) {
//from user type to internal representation (array)
return explode(',', $value);
},
],
],
],
],
],
];
}
}
Код: Выделить всё
<?php
use yii\helpers\Html;
use yii\helpers\ArrayHelper;
use yii\widgets\ActiveForm;
use app\models\Country;
use app\models\MediaMan;
/* @var $this yii\web\View */
/* @var $model app\models\MediaProduct */
/* @var $form yii\widgets\ActiveForm */
?>
<div class="media-product-form">
<?php $form = ActiveForm::begin(); ?>
<?= $form->field($model, 'name')->textInput(['maxlength' => true]) ?>
.....
<?
$authorsAsArray=ArrayHelper::map( MediaMan::find()->orderBy('name')->asArray()->all(), 'id', 'name');
?>
<?= $form->field($model, 'man_ids')
->dropDownList($authorsAsArray, ['multiple' => true]) ?>
<div class="form-group">
<?= Html::submitButton($model->isNewRecord ? 'Create' : 'Update', ['class' => $model->isNewRecord ? 'btn btn-success' : 'btn btn-primary']) ?>
</div>
<?php ActiveForm::end(); ?>
</div>