【问题标题】:Laravel-5 how to populate select box from database with id value and name valueLaravel-5 如何使用 id 值和名称值从数据库中填充选择框
【发布时间】:2015-06-13 00:52:03
【问题描述】:

我想使用illuminate\html 创建一个如下所示的选择框:

<select>
    <option value="$item->id">$item->name</option>
    <option value="$item->id">$item->name</option>
</select>

在我的控制器中我尝试了这个:

public function create()
{
    $items = Items::all(['id', 'name']);

    return view('prices.create', compact('id', 'items'));
}

在我看来:

<div class="form-group">
    {!! Form::Label('item', 'Item:') !!}
    {!! Form::select('item_id', $items, null, ['class' => 'form-control']) !!}
</div>

问题是显示实体的所有信息而不是$item-&gt;name

【问题讨论】:

    标签: php laravel laravel-5 blade


    【解决方案1】:

    只需将您的控制器更改为以下内容:

    public function create()
    {
        $items = Subject::all(['id', 'name']);
        return View::make('your view', compact('items));
    }
    

    你的看法:

    <div class="form-group">
      {!! Form::Label('item', 'Item:') !!}
      <select class="form-control" name="item_id">
        @foreach($items as $item)
          <option value="{{$item->id}}">{{$item->name}}</option>
        @endforeach
      </select>
    </div>
    

    希望这能解决您的问题

    【讨论】:

      【解决方案2】:

      我在pluck之后添加了toArray()

      $items = Item::pluck('name', 'id')->toArray();
      
      {{ Form::select('item_id', [null=>'Please Select'] + $items) }}
      

      【讨论】:

      • 谢谢。我正在寻找这个
      • 很高兴找到您的解决方案 :D 完美运行。谢谢!!
      【解决方案3】:

      Laravel >= 5.3 方法 lists() 已弃用 pluck()

      $items = Items::pluck('name', 'id');
      
      {!! Form::select('items', $items, null, ['class' => 'some_css_class']) !!}
      

      这将为您提供一个选择框,其选择选项与 DB 中的 id 编号相同

      例如,如果您的数据库表中有这个:

      id name
      1  item1
      2  item2
      3  item3
      4  item4
      

      在选择框中会是这样的

      <select>
      <option value="1">item1</option>
      <option value="2">item2</option>
      <option value="3">item3</option>
      <option value="4">item4</option>
      </select>
      

      我发现 pluck 现在返回一个集合,你需要在 pluck 的末尾添加 ->toArray() ......所以像这样:pluck('name', 'id')-&gt;toArray();

      【讨论】:

      • 不使用Form类怎么办? @foreach($elements as $element_each)&lt;option value="{!! $element_each-&gt;id !!}"&gt;{!! $element_each-&gt;name !!}&lt;/option&gt;@endforeach 给出错误。
      • 如果你使用表单类你必须安装门面。没有它就行不通。 Google for laravel 表单集体
      • 马试着把{!! !!}换成{{ }}
      【解决方案4】:

      试试这个。不使用控制器

      {{ Form::select('apartment_id', \App\Apartment::all()->pluck('apartment_name', 'apartment_id')->toArray(), null,['class'=>'select2 form-control', 'multiple'=>'multiple','required','id' => 'apartment_id']) }}
      

      【讨论】:

      • 为什么 OP 应该“试试这个”? 好的答案将始终解释所做的事情以及为什么以这种方式完成,不仅适用于 OP,而且适用于 SO 的未来访问者。
      【解决方案5】:

      我试图在 Laravel 5.8 中做同样的事情,但在静态调用 pluck 时遇到错误。对于我的解决方案,我使用了以下内容。该集合显然被称为 todoStatuses。

      <div class="row mb-2">
          <label for="status" class="mr-2">Status:</label>
          {{ Form::select('status', 
                      $todoStatuses->pluck('status', 'id'), 
                      null, 
                      ['placeholder' => 'Status']) }}
      </div>
      

      【讨论】:

        【解决方案6】:

        抱歉回复晚了

        显然lists 方法在 Laravel 中已经是 deprecated,但是你可以使用 pluck 方法。

        例如:

        Laravel 5.7

        public function create()
        {
            $countries =  Country::pluck('country_name','id');
            return View::make('test.new')->with('countries', $countries);
        }
        

        如果您是 FORM 组件,则在视图中传递为

        {{  Form::select('testname',$countries,null,['class' => 'required form-control select2','id'=>'testname']) }}
        

        如果会生成下拉菜单

        但我有一种情况表明选择国家作为第一个选项并作为空值

        <option value="" selected="selected">--Select  Country--</option>
        

        所以我提到了

        https://stackoverflow.com/a/51324218/8487424
        

        并修复了这个问题,但以后如果我想更改它,我讨厌在视图中更改它

        所以已经创建了基于https://stackoverflow.com/a/51324218/8487424的辅助函数并放在Country Model中

        public static  function toDropDown($tableName='',$nameField='',$idField='',$defaultNullText='--Select--')
        {
            if ($idField == null)
            {
                $idField="id";
            }
        
            $listFiledValues = DB::table($tableName)->select($idField,$nameField)->get();
        
                    $selectArray=[];
                    $selectArray[null] = $defaultNullText;
                    foreach ($listFiledValues as $listFiledValue) 
                    {
                        $selectArray[$listFiledValue->$idField] = $listFiledValue->$nameField;
                    }
                    return $selectArray;
                }
        

        在控制器中

        public function create()
            {
              $countries = Country::toDropDown('countries','name','id','--Select  Country--');
              return View::make('test.new')->with('countries', $countries);
            }
        

        终于在视图中

         {{  Form::select('testname',$countries,null,['class' => 'required form-control select2','id'=>'testname']) }}
        

        结果如预期,但我强烈建议使用pluck()方法

        【讨论】:

          【解决方案7】:

          要填充 laravel 中的下拉选择框,我们必须按照以下步骤操作。

          我们必须从控制器中获取这样的值:

           public function addCustomerLoyaltyCardDetails(){
                  $loyalityCardMaster = DB::table('loyality_cards')->pluck('loyality_card_id', 'loyalityCardNumber');
                  return view('admin.AddCustomerLoyaltyCardScreen')->with('loyalityCardMaster',$loyalityCardMaster);
              }
          

          同样我们可以在视图中显示:

           <select class="form-control" id="loyalityCardNumber" name="loyalityCardNumber" >
                 @foreach ($loyalityCardMaster as $id => $name)                                     
                      <option value="{{$name}}">{{$id}}</option>
                 @endforeach
           </select>
          

          您可以根据需要使用下拉列表中的此键值。 希望它可以帮助某人。

          【讨论】:

            【解决方案8】:

            已经说过很多,但请记住,有时您不想将数据库中的所有记录输出到您选择的输入字段中.....我一直在这所学校工作的关键示例我必须在选择语句中输出所有布告栏类别的管理站点。从我的控制器这是我写的代码

            公告板:: groupBy()->pluck('category')->get();

            这样你就可以得到不同的记录,因为它们已经被分组了,所以不会重复记录

            【讨论】:

              【解决方案9】:

              Laravel 5.3 使用 pluck($value, $key)

              $value 显示在您的下拉列表中,$key 是 id

              控制器

              $products = Product::pluck('name', 'id');
              
              return view('main.index', compact('products'));
              

              查看

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

              【讨论】:

              • 你真的应该添加一些解释为什么这应该工作 - 你也可以添加代码以及代码本身中的 cmets - 在当前的形式中,它没有提供任何可以帮助的解释社区的其他人了解您为解决/回答问题所做的工作。这对于较早的问题和已经有答案的问题尤其重要。您还应该努力正确格式化帖子中的代码。
              【解决方案10】:

              在您的控制器中,添加,

              public function create()
              {
                  $items = array(
                      'itemlist' =>  DB::table('itemtable')->get()
                    );
              
                  return view('prices.create', $items);
              }
              

              在你看来,使用

              <select name="categories" id="categories" class="form-control">
                @foreach($itemlist as $item)
                  <option value="{{ $item->id }}">{{ $item->name }}</option>
                @endforeach
              </select>
              

              在选择框中,会是这样的,

              <select>
               <option value="1">item1</option>
               <option value="2">item2</option>
               <option value="3">item3</option>
               ...
              </select>
              

              【讨论】:

                【解决方案11】:

                Laravel 5.*

                在您的控制器中:

                $items= Items::pluck('name', 'id')->toArray();
                return view('your view', compact('items', $items));
                

                在你看来:

                {{ Form::select('organization_id', $items, null, []) }}
                

                【讨论】:

                  【解决方案12】:

                  对于 Laravel 5:

                  $items = Items::lists('name', 'id');
                  

                  将一个项目推到集合的开头。

                  $items->prepend($value, $key = null);
                  

                  【讨论】:

                    【解决方案13】:

                    Laravel 提供了一个带有 lists() 函数的查询构建器

                    在你的情况下,你可以替换你的代码

                    $items = Items::all(['id', 'name']);
                    

                    $items = Items::lists('name', 'id');
                    

                    此外,您也可以将其与其他查询生成器链接。

                    $items = Items::where('active', true)->orderBy('name')->lists('name', 'id');
                    

                    来源:http://laravel.com/docs/5.0/queries#selects


                    Laravel 5.2 更新

                    非常感谢@jarry。正如你提到的,Laravel 5.2 的功能应该是

                    $items = Items::pluck('name', 'id');
                    

                    $items = Items::where('active', true)->orderBy('name')->pluck('name', 'id');
                    

                    ref: https://laravel.com/docs/5.2/upgrade#upgrade-5.2.0 -- 查看弃用列表

                    【讨论】:

                    • 因为 5.2 lists 已被弃用,取而代之的是 pluck。在您的示例中,它将是 Items::all(['id', 'name'])-&gt;pluck('name', 'id');
                    • Mininoz,如何在不使用 Form 类的情况下在刀片中显示选择框,例如@foreach($items as $items_each)&lt;option value="{!! $items_each-&gt;id !!}"&gt;{!! $items_each-&gt;name !!}&lt;/option&gt;@endforeach
                    • 嗨,我在 laravel 5.5 上使用你的代码,它说'试图获取非对象的属性'。需要紧凑型吗?
                    【解决方案14】:

                    控制器

                     $campaignStatus = Campaign::lists('status', 'id');
                    

                    compact('campaignStatus') 将导致 [id=>status]; //示例 [1 => '待定']

                    return view('management.campaign.index', compact('campaignStatus'));
                    

                    查看

                    {!! Form::select('status', $campaignStatus, array('class' => 'form-control')) !!}
                    

                    【讨论】:

                    • 使用这个表达式类 -> 表单控制不起作用。 Naing Win 回答 {!! Form::select('item_id', $items, null, ['class' => 'form-control']) !!} 有效
                    【解决方案15】:

                    Laravel 将数组用于Form::select。所以我传递了如下数组:

                    $datas = Items::lists('name', 'id');
                    $items = array();
                    
                    foreach ($datas as $data)
                    {
                        $items[$data->id] = $data->name;
                    }
                    
                    return \View::make('your view', compact('items',$items));
                    

                    在你看来:

                    <div class="form-group">
                        {!! Form::label('item', 'Item:') !!}
                        {!! Form::select('item_id', $items, null, ['class' => 'form-control']) !!}
                    </div>
                    

                    【讨论】:

                      猜你喜欢
                      • 2013-11-29
                      • 1970-01-01
                      • 1970-01-01
                      • 2017-09-13
                      • 1970-01-01
                      • 2012-06-07
                      • 2014-05-02
                      • 1970-01-01
                      相关资源
                      最近更新 更多