ed-smartass / yii2-relation-behavior
用于获取和保存ActiveRecord关系的Behavior
1.0.3
2022-05-21 23:59 UTC
Requires
- yiisoft/yii2: ~2.0.14
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'], // ... ]; }
限制
此行为只能成功保存真正的基本关系
- 一对一
- 多对一
- 多对多