I have an Org model and a Tag model. I want to associate tags with organizations. My database tables and Eloquent models are set up like so ...
org
id - integer
name - string
...
tags
id - integer
name - string
taggables
id - integer
taggable_id - integer
taggable_type - string
// app/models/Org.php
class Org extends Eloquent
{
protected $table = "org";
...
public function tags()
{
return $this->morphToMany('Tag', 'taggable');
}
}
// app/models/Tag.php
class Tag extends Eloquent
{
protected $table = "tags";
public $timestamps = false;
public function org()
{
return $this->morphedByMany('Org', 'taggable');
}
}
In my view, I have a form with a multiple select box where the user can select the tags he/she wants to be associated with the organization ...
...
{{ Form::select('tags[]', $tag_options, null, array(
'multiple',
'data-placeholder' => 'Select some tags'))
}}
...
... And $tag_options comes from my routes.php file ...
View::composer('*', function($view)
{
$tags = Tag::all();
if(count($tags) > 0)
{
$tag_options = array_combine($tags->lists('id'),
$tags->lists('name'));
}
else
{
$tag_options = array(null, 'Unspecified');
}
$view->with('tag_options', $tag_options);
});
When the form in my view is submitted, the following route will catch it to update the org model ...
Route::put('org/{org}', function(Org $org){
$org->description = Input::get('description');
$org->website = Input::get('website');
$org->tags = Input::get('tags');
$org->save();
return Redirect::to('org/'.$org->id)
->with('message', 'Seccessfully updated page!');
});
Now, Input::get('tags') is just an array of the tag IDs, of the form
["1","6","8"]
How can I use this to associate the tags with the organization?
I also have comments set up for organizations using a polymorphic relationship where I just do this ...
Route::put('org/post/{org}', function(Org $org){
$comment = new Comment;
$comment->user_id = Auth::user()->id;
$comment->body = Input::get('body');
$comment->commentable_id = $org->id;
$comment->commentable_type = 'Org';
$comment->save();
return Redirect::to('org/'.$org->id)
->with('message', 'Seccessfully posted comment!');
});
However, it's not as simple with a many-to-many polymorphic relationship when I want to associate one or more tags with an organization.
Any help is appreciated, thanks!!
You can use all of the
belongsToMany
methods for this, for polymorphic many-to-many extends that relation:All of those methods work both ways of course.
Examples:
Your case: