选择 2 不显示选定选项。 (拉拉维尔)

Posted

技术标签:

【中文标题】选择 2 不显示选定选项。 (拉拉维尔)【英文标题】:Select 2 doesn't show the Selected Options. (Laravel) 【发布时间】:2016-08-07 07:39:15 【问题描述】:

我正在使用 select2 jquery 插件和 laravel 表单模型绑定来呈现来自服务器的数据。 虽然其他一切正常,但它不会将已附加到帖子的标签呈现为选定选项。

一定有什么我不知道的,这是我的观点。

<div class="form-group">
    !! Form::label('tag_list','Tags:') !!
    !! Form::select('tag_list[]', $tags,null,['id'=>'tag_list', 'class'=>'form-control','multiple']) !!

</div>

// This is the select 2 script
$('#tag_list').select2(
    'placeholder':'Choose Tags',
    tags:true,
    tokenSeparators:[",", " "],
    createTag:function(newTag)
        return
            id:'new:' + newTag.term,
            text:newTag.term + '(new)'
        ;
    
);

这是文章模型中的 getTagListAtrribute 函数

//这是getTagListAttribute函数

 public function getTagListAttribute()
        return $this->tags->lists('post_id')->all();
    

然后我像这样从控制器加载编辑表单:

public function article_edit($slug)
        // fetch the articles.
        //$article = DB::table('articles')->where('slug',$slug)->first();

        $article = Article::where('slug',$slug)->first();

        /*echo '<pre>';
        print_r($article->title);
        die();*/
        $tags = DB::table('tags')->lists('name','tag_id');
        $categories=DB::table('categories')->lists('category_name','category_id');

        return view('admin.pages.edit', compact('article','tags','categories'));
    

我只想在页面加载时选择与文章关联的标签,而我一直无法选择。所以我需要帮助。

【问题讨论】:

这可能只是我没有注意到显而易见的,但是您在哪里设置选定的值? 据我所知,当我使用 null 时,表单模型绑定应该解决这个问题。 如果您在代码 sn-p 中也有 Form::model 代码,也许它会在视觉上有所帮助。 对不起,我确实提到我正在使用表单模型绑定。我可以编辑原始问题。 【参考方案1】:

好吧,既然您已将问题标记为laravel-5.1。对lists 方法进行了一些更改。

在 Laravel 5.0.* 中,它仅返回您在 lists 方法中传递的 keys 和/或 values 的普通数组。 More info here

在 Laravel 5.1.* 中,它返回一个 Collection 对象。 More Info - Just the code documentation

所以,您正在寻找的解决方案是:

在控制器中,这样做:

$tags = DB::table('tags')->lists('name','tag_id')->toArray();

或者在视图文件中,这样做:

!! Form::select('tag_list[]', $tags->toArray(), null,['id'=>'tag_list', 'class'=>'form-control','multiple']) !!

这应该对你有用。

编辑 1:

getTagsListAttribute() 中删除all() 方法。这根本不需要。

你为什么使用DB Facade 来查询tags 表?由于您已经建立了关系,因此您不必要地执行SQL Statements。尽可能避免这种情况。

你应该通过简单地这样做来获得它:

$tags = $article->tags;

编辑 2:

您确定tags 表中有tag_id 列吗?我不信。我想这一定是一个错字。你一定输入了tag_id而不是id。交叉验证以进行确认。

希望这对您有所帮助。快乐编码。干杯。

【讨论】:

感谢您的回答,是的,我确实有 tag_id,我通常使用这样的约定来避免多个 id 的混淆。让我检查一下,如果这样做的话。并且 $article->tags 将只获取关联的标签,但在这里我希望所有标签都传递到视图中。所以我使用 DB:: 查询。 我使用的是 laravel 5.1.23 版,当我对 $tags 变量执行 toArray() 时,它会显示调用非对象中的成员函数 toArray()。我想这不应该是错误。有什么帮助吗?【参考方案2】:

像这样设置选择表单标签

!! Form::select('tag_list', $tags, $selected, ['id'=>'tag_list', 'name'=>'tag_list[]','class'=>'form-control','multiple']) !!

在第三个 ($selected) 中传递要选择的 id 作为数组。 所以,如果

  $tags = ['1'=>'one', '2'=>'Two', '3'=>'Three'] 

如果要选择 One 和 Three,请将这些 id 作为数组传递给表单 select 作为第三个参数。

所以,$selected = [1,3];

【讨论】:

我想从控制器中选择那些值,而 getTagListAttribute() 函数背后的基本原因是获取具有特定 post_id 的关联标签。

以上是关于选择 2 不显示选定选项。 (拉拉维尔)的主要内容,如果未能解决你的问题,请参考以下文章

用于显示集合的刀片组件继承。拉拉维尔 7

方法保存不存在。拉拉维尔

如何显示具有相同值的最后一行的总数? (拉拉维尔)

拉拉维尔 5.5。工匠命令排队

Macroable.php 第 74 行中的 BadMethodCallException:方法保存不存在。拉拉维尔 5.2

此路由不支持 GET 方法。支持的方法:PUT。与放置形式。拉拉维尔