diff --git a/README.md b/README.md index 18e5024..a3bac3a 100644 --- a/README.md +++ b/README.md @@ -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 getMyModelUsers() + public function getProjectUsers() { 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 as follow: ```php -// Has one relation using a model -$model = MyModel::findOne(321); -$company = Company::findOne(123); -$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. diff --git a/src/SaveRelationsBehavior.php b/src/SaveRelationsBehavior.php index 461f89e..f209859 100644 --- a/src/SaveRelationsBehavior.php +++ b/src/SaveRelationsBehavior.php @@ -29,8 +29,8 @@ class SaveRelationsBehavior extends Behavior { return [ ActiveRecord::EVENT_BEFORE_VALIDATE => 'beforeValidate', - ActiveRecord::EVENT_AFTER_INSERT => 'afterSave', - ActiveRecord::EVENT_AFTER_UPDATE => 'afterSave', + ActiveRecord::EVENT_AFTER_INSERT => 'afterSave', + ActiveRecord::EVENT_AFTER_UPDATE => 'afterSave', ]; } @@ -218,7 +218,6 @@ class SaveRelationsBehavior extends Behavior return true; } - /** * * @param ActiveRecord $model @@ -248,7 +247,8 @@ class SaveRelationsBehavior extends Behavior $relationName, ActiveRecord $relationModel, ModelEvent $event - ) { + ) + { /** @var ActiveRecord $model */ $model = $this->owner; if (!is_null($relationModel) && ($relationModel->isNewRecord || count($relationModel->getDirtyAttributes()))) {