我应该如何在Laravel 5.2中制作此表单?

时间:2018-02-07 17:50:41

标签: laravel-5 eloquent many-to-many

当我开始这个项目时,我避免使用Laravel的表单助手,因为它似乎是一种复杂的方式来制作一个根本没有增加可读性的表单。我现在希望我拥有,因为模型形式绑定比我预期的要困难得多。

这个项目是一个博客网站,帖子已经设置为与标签有多对多的关系(底部发布的模型和表格模式)。当我去编辑帖子时,我希望在该字段中选择与该帖子相关联的标签,并选择删除它们以及添加新标签。这是我必须要开始的:

<div class="form-group">
    <select class="form-control select2-multi" name="tags[]" multiple="multiple">
        @foreach($post->tags as $tag)

            <option value="{{ $tag->id }}" selected>{{ $tag->name }}</option>

        @endforeach

        @foreach($tags as $tag)

            <option value="{{ $tag->id }}">{{ $tag->name }}</option>

        @endforeach
    </select>
</div>

我意识到我遇到了一个问题,那些打印出来的标签也会在第二个foreach中打印出来。

此时我很难过。我有两个想法,但我想遵循什么是最佳做法,所以任何建议都值得赞赏:

  1. 在将控制器传递给视图之前,使用控制器中的过程编程从标记数组中删除与$ post-&gt;标记标记匹配的任何标记。

  2. 在代码控制器中创建一个方法,该方法构建一个查询以选择除了与作为参数传递ID的帖子相关的所有标记。

  3. 我对SQL查询的想法会做到这一点(但我不确定如何以雄辩的方式执行此操作):

    SELECT  *
    FROM    tags
    WHERE   id NOT IN(  SELECT  tag_id
                        FROM    posts INNER JOIN post_tag ON posts.id=post_tag.post_id)
    

    我是否比这更复杂?我应该只使用表单助手将数据绑定到我的表单吗?

    ---帖子和标签模型加上DB模式---

    发布模型

    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');
        }
    }
    

    标记模型

    class Tag extends Model
    {
        protected $table    = "tags";
        public $timestamps  = false;
    
        public function posts()
        {
            return $this->belongsToMany('App\Post', 'post_tag', 'tag_id', 'post_id');
        }
    }
    

    架构

    posts(id, title, body, slug, category_id, created_at, updated_at)
    tags(id, name)
    post_tag(id, post_id, tag_id)
    

1 个答案:

答案 0 :(得分:1)

这是我的建议。

在你的控制器中

public function edit(Post $post){

    $tags = Tag::all();
    $postTags = $post->tags->pluck('id')->toArray();

    return view('edit', compact('tags', 'postTags'));
}

在你的刀片中

...
@foreach($tags as $tag)

    {{--We list all the tags--}}

    {{--While listing them, we check if the current tag is part of the tags belonging to this post--}}

    {{--If it belongs then we select it--}}

    <option value="{{ $tag->id }}" {{ in_array($tag->id, $postTags) ? "selected" : null }}>{{ $tag->name }}</option>

@endforeach
...