ed-smartass/yii2-relation-behavior

用于获取和保存ActiveRecord关系的Behavior

1.0.3 2022-05-21 23:59 UTC

This package is auto-updated.

Last update: 2024-09-22 05:00:57 UTC


README

安装

composer require ed-smartass/yii2-relation-behavior

示例

use Smartass\Yii2RelationBehavior\RelationBehavior;

// ...

/**
 * @inheritdoc
 */
public function behaviors()
{
    return [
        // ...
        'relation' => [
            'class' => RelationBehavior::class,
            'relations' => [
                // Many to one relation
                'manufacturer' => [
                    'target' => Manufacturer::class,
                    'link' => ['manufacturer_id' => 'manufacturer_id']
                ],
                // One to many relation
                'modelCategories' => [
                    'target' => ModelCategories::class,
                    'link' => ['model_id' => 'model_id'],
                    'multiple' => true
                ],
                // Many to many relation
                'categories' => [
                    'target' => Category::class,
                    'link' => ['category_id' => 'category_id'],
                    'multiple' => true,
                    'via' => 'modelCategories'
                ]
            ]
        ]
        // ...
    ];
}

// ...

关系设置

  • target — 目标类

    • 类型: string
    • 必需: true
  • link — 链接条件(与原生yii2声明相同)

    • 类型: array
    • 必需: true
  • multiple — 是否为多关系(如果为true,关系将类似于$this->hasMany(...),否则为$this->hasOne(...)

    • 类型: bool
    • 必需: false
    • 默认: false
  • onCondition — 链接条件(将扩展为$this->hasMany(...)->onCondition(['status' => Category::STATUS_ACTIVE])

    • 类型: array|null
    • 必需: false
    • 默认: null
  • filter — 额外的链接筛选器

    • 类型: array|string|Closure|null
    • 必需: false
    • 默认: null
  • via — 交叉关系名称(将扩展为$this->hasMany(...)->via(...)

    • 类型: string|null
    • 必需: false
    • 默认: false
  • extraColumns — 链接多对多关系的额外列

    • 类型: array|null
    • 必需: false
    • 默认: []
  • find - 从数组中搜索相关记录的回调(如果您设置了关系值$model->manufacturer = ['manufacturer_id' => 12]

    • 类型: Closure|null
    • 必需: false
    • 默认: Closure(通过所有主键键进行搜索)

如何使用

此行为将允许您像通常一样使用相关模型,而无需创建额外的函数

public function getCategories()
{
    return $this->hasMany(...);
}

相反,您只需要在行为中声明此内容,如示例所示。此外,此行为可以创建或保存相关模型的更改。为此,行为使用事务。因此,您可以这样做

$model->categories = [
    ['category_id' => 1], // Will find (or create if not exists) category with category_id `1`
    ['category_id' => 2, 'name' => 'New name'], // Will find (or create) category with category_id `1` and change name
    ['name' => 'New category'] // Will create new category
];
$model->save();

每个相关模型在保存之前都会进行验证。如果验证失败,事务将取消。__ 不要忘记将关系添加到模型的rules中作为safe

/**
 * @inheritdoc
 */
public function rules()
{
    return [
        // ...
        ['categories', 'safe'],
        // ...
    ];
}

限制

此行为只能成功保存真正的基本关系

  • 一对一
  • 多对一
  • 多对多