RelationalBehavior — поведение упрощающее работу с many-to-many relations

Представьте у нас есть:

  • таблица с продуктами
  • таблица со свойствами продуктов
  • и таблица связей продуктов и свойств

На языке Yii2 подобное будет иметь вид:

<?php

class Product extends \yii\db\ActiveRecordInterface
{
    public function behaviors()
    {
        return [
            \skeeks\cms\behaviors\RelationalBehavior::className(), // enable behavior
        ];
    }

    public function rules()
    {
        return [
            ['properies', 'safe'], // allow set permissions with setAttributes()
        ];
    }

    // define many-to-many relation
    public function getProperies()
    {
        return $this->hasMany(Property::className(), ['id' => 'property_id'])
            ->viaTable('product2properties', ['product_id' => 'id']);
    }
}

За одним исключением, мы объявили поведение 

\skeeks\cms\behaviors\RelationalBehavior

Оно то и будет упращять нашу жизнь в дальнейшем.

Теперь для построения формы редаткирования этого продукта можно всего лишь написать:

<?= $form->field($model, 'properties')->checkboxList(\yii\helpers\ArrayHelper::map(
     Property::find()->all(), 'id', 'name'
)); ?>

Еще примеры для наглядности, какие возможности дает это поведение:

$product = Product::findOne(1);
$product->properties = 1;
// or
$product->properties = [1,2];
// or
$product->properties = Property::findOne(1);
// or
$product->properties = Property::find()->all();
// or
$product->load(Yii::$app->request->post());
// or
$product->setAttributes(['properties' => [1,2]]);
// then
$product->save();

 

Все комментарии (0)
Нет комментариев