Load, validate and save automatically hasMany
relations.
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.
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,
]);
}
}
This Package is inspired by:
I wanted to have a combination of both. Thanks to both authors.