选择 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 不显示选定选项。 (拉拉维尔)的主要内容,如果未能解决你的问题,请参考以下文章
Macroable.php 第 74 行中的 BadMethodCallException:方法保存不存在。拉拉维尔 5.2