@ -1,7 +1,13 @@
Yii2 Active Record Save Relations Behavior
==========================================
Automatically validate and save Active Record related models.
Both Has Many and Has One relations are supported.
Automatically validate and save related Active Record models.
Features
--------
- Both `hasMany()` and `hasOne()` relations are supported
- Works with existing as well as new models
- Composite primary keys are supported
- Only pure Active Record API is used so it should work with any DB driver
Installation
------------
@ -11,13 +17,13 @@ The preferred way to install this extension is through [composer](http://getcomp
Either run
```
php composer.phar require --prefer-dist lhs/yii2-save-relations-behavior "*"
php composer.phar require --prefer-dist la- haute- societe /yii2-save-relations-behavior "*"
```
or add
```
"lhs/yii2-save-relations-behavior": "*"
"la- haute- societe /yii2-save-relations-behavior": "*"
```
to the require section of your `composer.json` file.
@ -66,7 +72,7 @@ class Project extends \yii\db\ActiveRecord
/**
* @return ActiveQuery
*/
public function getMyModel Users()
public function getProject Users()
{
return $this->hasMany(ProjectUser::className(), ['project_id' => 'id']);
}
@ -81,27 +87,46 @@ class Project extends \yii\db\ActiveRecord
}
```
Though not mandatory, it is highly recommended to activate the transactions
> Though not mandatory, it is highly recommended to activate the transactions for the owner model.
Usage
-----
Every declared relations in the `relations` behavior parameter can now be set as follow:
Every declared relations in the `relations` behavior parameter can now be set and saved a s follow:
```php
// Has one relation using a model
$model = MyModel::findOne(321) ;
$company = Company::findOne(1 23 );
$model->company = $company ;
$model ->save();
$project = new Project();
$project->name = "New project" ;
$project-> company = Company::findOne(2);
$project->users = User::findAll([1,3]) ;
$project ->save();
```
or
You can set related model by only specifying its primary key:
```php
$project = new Project();
$project->name = "Another project";
$project->company = 2;
$project->users = [1,3];
$project->save();
```
You can even set related models as associative arrays like this:
```php
// Has one relation using a foreign key
$model = MyModel::findOne(321);
$model->company = 123; // or $model->company = ['id' => 123];
$model->save();
$project = Project::findOne(1);
$project->company = ['name' => 'GiHub', 'description' => 'Awesome'];
$project->save();
```
Attributes of the related model will be massively assigned using the `load() method. So remember to declare the according attributes as safe in the rules of the related model.
> **Notes:**
> - Related models are saved during the EVENT_BEFORE_VALIDATE event of the owner model. Transaction will start at this point according to the transactions() method of the model.
> - Only newly created or changed related models will be saved.
> See the PHPUnit tests for more examples.
Validation
----------
Every declared related models will be validated prior to be saved. If any validation fails, an error associated with the named relation will be added to the owner model.
For `hasMany()` relations, the index of the related model will be used to identifiy the associated error.