When I started this project I avoided using Laravel's form helper because it seemed like a convoluted way to make a form that didn't increase readability at all. I now wish that I had because model form binding is a lot harder than I anticipated.
This project is a blog website and posts have been set up to have a many-to-many relationship with tags (models posted at the bottom along with table schemas). When I go to edit a post, I want to have the tags associated with that post already selected in the field, with the option to remove them as well as add new tags. This is what I have to start:
<div class="form-group">
<select class="form-control select2-multi" name="tags[]" multiple="multiple">
@foreach($post->tags as $tag)
<option value="" selected></option>
@endforeach
@foreach($tags as $tag)
<option value=""></option>
@endforeach
</select>
</div>
I realized I have a problem in that tags that are printed out as selected also get printed out in the second foreach.
At this point I am stumped. I have two ideas for what to do but I want to follow what would be the best practice so any advice is appreciated:
-
Use procedural programming in the controller to remove any tags from the tag array that match the $post->tags tags before passing it to the view.
-
Create a method in the tags controller that builds a query to select all tags except those associated with a post who's ID is passed as a parameter.
My idea for a SQL query that would do this (but I am unsure how to do this in eloquent):
SELECT *
FROM tags
WHERE id NOT IN( SELECT tag_id
FROM posts INNER JOIN post_tag ON posts.id=post_tag.post_id)
Am I making this problem more complicated than it is? Should I just use the form helper to bind the data to my form?
--- Post and Tag Models plus DB Schemas ---
Post model
class Post extends Model
{
protected $table = 'posts';
/**
* Define relationship between posts and categories.
*
* @return eloquent relationship
*/
public function category()
{
return $this->belongsTo('App\Category', 'category_id');
}
/**
* Define relationship between posts and tags.
*
* @return eloquent relationship
*/
public function tags()
{
return $this->belongsToMany('App\Tag', 'post_tag', 'post_id', 'tag_id');
}
}
Tag model
class Tag extends Model
{
protected $table = "tags";
public $timestamps = false;
public function posts()
{
return $this->belongsToMany('App\Post', 'post_tag', 'tag_id', 'post_id');
}
}
Schemas
posts(id, title, body, slug, category_id, created_at, updated_at)
tags(id, name)
post_tag(id, post_id, tag_id)
via Chebli Mohamed
Aucun commentaire:
Enregistrer un commentaire