【问题标题】:How can i display the categories to which a post belongs to as selected and also all categories我如何显示帖子所属的类别以及所有类别
【发布时间】:2019-08-23 15:31:16
【问题描述】:

希望你们都做得很好。我在帖子和类别表之间有多对多的关系。通过使用数据透视表,我可以获取帖子所属的所有类别,但我无法获取数据库中存在的所有类别。

这是我的编辑帖子方法:

public function edit(Post $post)
{
    $post=Post::find($post->id);
    $categories=Category::all();
    return view('admin.pages.post.edit',compact('post','categories'));
}

我认为这是我使用的:

<div class="form-group">
   <label>Categories</label>
    <select class="form-control" id="select2" name="categories_id[]" multiple="multiple">
     @foreach($post->categories as $category)
        <option value="{{ $category->id }}" selected>{{ $category->name}}</option>
     @endforeach

^^ 这显示了帖子所属的当前类别。

现在我有一个属于 WEB 类别的帖子。它在编辑页面中将 WEB 显示为一个类别但我还想显示帖子最初不属于的所有类别(AI、ML 等),以便用户可以选择更新帖子所属的类别属于。

我也使用 select2 作为多选框

这就是我所拥有的

这就是我所追求的

【问题讨论】:

  • 强烈推荐 LaravelCollective - 表单模型绑定可以自动处理这个问题。现在,你在所有东西上都设置了“selected”——做一个 if-check 看看你是否应该设置 selected 标志。
  • 这就是问题所在,因为我似乎无法弄清楚仅将帖子所属的类别设置为选中的逻辑。我的数据透视表有两列 cat_id 和 post_id
  • 我是 laravel 的新手,开始自己开发一个小博客来学习它。到目前为止,我已经通过这个博客学习了 mare laravel,然后我可以按照教程进行操作

标签: php laravel blogs


【解决方案1】:

在 HTML 表单上,你可以像这样检查id 是否是$post 的一部分(我会做最容易理解的,你可以通过多种方式重构):

 <option value="{{ $category->id }}" {{isset($post->categories->where('id', $category->id)->first())?'selected':''}}>{{ $category->name}}</option>

为使此操作变得简单且对数据库的调用最少,请在刀片视图的循环之前将类别关系加载到您的帖子中。您不需要您拥有的行 ($post=Post::find($post-&gt;id);),因为您的路由模型绑定已经注入了它。

在您的控制器edit 方法中:

 public function edit(Post $post)
 {
     $post->load('categories');
     $categories=Category::all();
     return view('admin.pages.post.edit',compact('post','categories'));
 }

我假设您在 Post 模型中正确设置了从 categoriesposts 的关系。但这本质上只是询问“此表单上的此帖子是否具有此类别(根据此循环),然后将其标记为选中”。

我真的很喜欢 LaravelCollective 的方式,也推荐你看看 at the library。它将模型绑定到表单,并自动为您选择选定的项目。您可以使用 Collective 像这样简单地完成它:

 {!! Form::select('categories[]', $categories, null, ['class'=>'form-control', 'multiple', 'id'=>'categories']) !!}

【讨论】:

  • 好的,我已经编辑了 - 你需要用categories 加载你的posts。我还将 exists() 更改为 first() + isset 以使其更清晰。
【解决方案2】:

在搜索数小时后修复了问题

在我所做的编辑方法中:

public function edit(Post $post)
{
    $post=Post::with('tags','categories')->find($post->id);
    $tags=Tag::all();
    $categories=Category::all();
    return view('admin.pages.post.edit',compact('post','categories','tags'));
}

在我做的视图中:

<div class="form-group">
       <label>Categories</label>
       <select class="form-control" id="categories" name="categories[]" multiple="multiple">
           @foreach($categories as $category)
           <option value="{{ $category->id }}"
                @foreach($post->categories as $postCat)
                      {{ $postCat->id==$category->id?'Selected':'' }}
                @endforeach
           >{{ $category->name}}</option>
           @endforeach
        </select>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-25
    • 2017-06-22
    • 2019-06-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多