solutosoft / yii-linkmany
Load, validate and save automatically related Active Record models
Installs: 2 176
Dependents: 0
Suggesters: 0
Security: 0
Stars: 4
Watchers: 2
Forks: 0
Open Issues: 0
Type:yii2-extension
Requires
- yiisoft/yii2: ~2.0.14
Requires (Dev)
- phpunit/phpunit: ^7.5 || ^8.0
README
Load, validate and save automatically hasMany
relations.
Installation
The preferred way to install this extension is through composer.
Either run
php composer.phar require --prefer-dist solutosoft/yii-linkmany
or add
"solutosoft/yii-linkmany": "*"
to the require section of your composer.json.
Usage
This extension provides support for ActiveRecord hasMany
relation saving.
This support is granted via [[\solutosoft\linkmany\LinkManyBehavior]] ActiveRecord behavior. You'll need to attach
it to your ActiveRecord class and point the target "has-many" relation for it:
class Post extends ActiveRecord { public function behaviors() { return [ 'linkManyBehavior' => [ 'class' => LinkManyBehavior::class, 'relations' => [ 'tags', 'messages' => [ 'formName' => 'Post[messages]', 'validate' => false, 'deleteOnUnlink' => false ] ] ], ]; } public function getMessages() { return $this->hasMany(Message::class, ['post_id' => 'id']); } public function getTags() { return $this->hasMany(Tag::class, ['id' => 'tag_id']) ->viaTable('post_tag', ['post_id' => 'id']); } }
Being attached [[\solutosoft\linkmany\LinkManyBehavior]] you can load data using the method [[\solutosoft\linkmany\LinkManyBehavior::fill]]
use yii\web\Controller; class PostController extends Controller { public function actionCreate() { $model = new Post(); /** * $_POST could be something like: * [ * 'tags' => [1,2] * 'comments' => [ * [ * 'subject' => 'First comment', * 'content' => 'This is de fist comment', * ], [ * 'subject' => 'Second comment', * 'content' => 'This is de second comment', * ] * ] * ]; */ if ($model->fill(Yii::$app->request->post())) { $model->save(); // save the model and relations return $this->redirect(['view']); } return $this->render('create', [ 'model' => $model, ]); } }
Credits
This Package is inspired by:
I wanted to have a combination of both. Thanks to both authors.