Подтвердить что ты не робот

Laravel-5, как заполнить поле выбора из базы данных с идентификатором и значением имени

Я хочу создать поле выбора, подобное приведенному ниже, используя 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->name отображается вся информация объекта.

4b9b3361

Ответ 1

Laravel предоставляет построитель запросов с функцией lists()

В вашем случае вы можете заменить свой код

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

с

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

Кроме того, вы можете связать его с другим Query Builder.

$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 - посмотрите списки исключений

Ответ 2

Laravel >= 5.3 список методов() устарел использовать pluck()

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

{!! Form::select('items', $items, null, ) !!}

Это даст вам поле выбора с теми же параметрами выбора, что и номера идентификаторов в DB

например, если вы указали это в своей таблице DB:

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 теперь возвращает коллекцию, и вам нужно добавить → toArray() в конец pluck... так вот так: pluck('name', 'id')->toArray();

Ответ 3

Просто измените ваш контроллер на следующее:

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

И ваш взгляд на:

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

Надеюсь, что это решит вашу проблему.

Ответ 4

контроллер

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

compact ('campaignStatus') приведет к [id = > status];//пример [1 = > 'pending']

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

Просмотр

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

Ответ 5

В вашем контроллере добавьте

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>

Ответ 6

Использовать массив 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>

Ответ 7

Laravel 5.3 использует pluck ($ value, $key)

$value отображается в вашем списке, а ключ $id

контроллер

$products = Product::pluck('name', 'id');

return view('main.index', compact('products'));

вид

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

Ответ 8

Laravel 5. *

В вашем контроллере:

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

На ваш взгляд:

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

Ответ 9

Я добавил toArray() после pluck

$items = Item::get()->pluck('name', 'id')->toArray();

{{ Form::select('item_id', [null=>'Please Select'] + $items) }}

Ответ 10

Извините за задержку с ответом

Очевидно, метод lists deprecated в Laravel, но вы можете использовать метод pluck.

Например:

Ларавел 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 и помещены в модель страны.

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()

Ответ 11

Для Laravel 5:

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

Нажмите элемент в начале коллекции.

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

Ответ 12

Попробуйте это. Без использования контроллера

{{Форма:: select ('apartment_id',\App\Apartment:: all() → pluck ('apartment_name', 'apartment_id') → toArray(), null, ['class' = > ' select2 form-control ',' multiple '= > ' multiple '])}}

Ответ 13

О многих уже говорилось, но имейте в виду, что бывают случаи, когда вы не хотите выводить все записи из базы данных в выбранное вами поле ввода..... Ключевой пример Я работал на этом сайте управления школой, где Я должен вывести все категории доски объявлений в утверждении выбора. С моего контроллера это код, который я написал

Noticeboard :: groupBy() → pluck ('category') → get();

Таким образом, вы получите отличную запись, так как они были сгруппированы, так что нет повторения записей

Ответ 14

Чтобы заполнить выпадающий список выбора в 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>

Это ключевое значение в раскрывающемся списке вы можете использовать в соответствии с вашими требованиями. Надеюсь, это может кому-то помочь.

Ответ 15

Я пытался сделать то же самое в 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>