Доп-поле в в промежуточную таблицу с помощью поведения voskobovich/yii2-linker-behavior

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
alexnew2000
Сообщения: 104
Зарегистрирован: 2015.10.04, 09:47

Доп-поле в в промежуточную таблицу с помощью поведения voskobovich/yii2-linker-behavior

Сообщение alexnew2000 »

Здравствуйте знатоки поведения voskobovich/yii2-linker-behavior .

Можно ли добавлять дополнительное поле в промежуточную таблицу используя это поведение ? Что нужно прописать в Геттерах - зеттерах?
Поясню зачем .
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>
 
alexnew2000
Сообщения: 104
Зарегистрирован: 2015.10.04, 09:47

Re: Доп-поле в в промежуточную таблицу с помощью поведения voskobovich/yii2-linker-behavior

Сообщение alexnew2000 »

rugabarbo писал(а): 2017.03.19, 13:49 Задайте эти вопросы автору: https://github.com/voskobovich/yii2-lin ... ior/issues
Да, спасибо. Так и поступлю.
alexnew2000
Сообщения: 104
Зарегистрирован: 2015.10.04, 09:47

Re: Доп-поле в в промежуточную таблицу с помощью поведения voskobovich/yii2-linker-behavior

Сообщение alexnew2000 »

Списавшись с автором расширения, автор пояснил, что поведение не поддерживает без допила ядра ту возможность , что мне нужна. Занялся написанием своего велосипеда на основании найденного аналога.
Ответить