2016-04-15 130 views
2

我使用select2 jquery插件和laravel表单模型绑定来呈现来自服务器的数据。 尽管其他一切正常,但它不会将已附加到帖子的标签呈现为选定选项。选择2不显示所选选项。 (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')); 
    } 

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

+0

这可能只是我不明显,但你在哪里设置值选择? – apokryfos

+0

表单模型绑定应该照顾到,当我使用null据我所知。 – user2906838

+0

如果你在代码片段中也有'Form :: model'代码,那么它可能会有帮助。 – apokryfos

回答

0

集合中选择的形式这样

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

标签传递的ID被选择为在第三阵列(选择$)。 所以,如果

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

,你想一个和三个选择,通过这些ID作为数组的形式选择作为第三个参数。

so,$ selected = [1,3];

+1

我想从控制器中选择这些值,并且getTagListAttribute()函数背后的基本原因是使用特定的post_id获取关联的标记。 – user2906838

3

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

在Laravel 5.0。*中,它只返回了您在lists方法中通过的普通数组keys和/或valuesMore 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']) !!} 

而且这应该为你做诡计。

EDIT 1:

getTagsListAttribute()删除all()方法。这不是必需的。

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

你应该简单地做这样得到它:

$tags = $article->tags; 

编辑2:

你确定你在tags表有tag_id列?我不信。我想这肯定是一个错字。错误地,你必须输入tag_id而不是id。交叉验证以确认。

希望这可以帮助你。快乐编码。干杯。

+0

我感谢你的回答,是的,我确实有tag_id,我通常使用这样的约定来避免多个ID的混淆。让我检查一下,如果这样做的话。而$ article->标签只会获取相关的标签,但在这里我希望所有标签都在视图上传递。所以我使用DB :: query。 – user2906838

+0

我使用的是laravel版本5.1.23,当我在$ tags变量上执行toArray()时,它说,在非对象中调用成员函数toArray()。我想这不应该是错误。任何帮助? – user2906838