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

36

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

Теги:
laravel-5
blade

10 ответов

72
Лучший ответ

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

  • 6
    начиная с 5.2 lists устарели в пользу pluck . в вашем примере это будут Items::all(['id', 'name'])->pluck('name', 'id');
  • 2
    Мининоз, как я могу показать блок выбора в @foreach($items as $items_each)<option value="{!! $items_each->id !!}">{!! $items_each->name !!}</option>@endforeach без использования класса Form , например, @foreach($items as $items_each)<option value="{!! $items_each->id !!}">{!! $items_each->name !!}</option>@endforeach
Показать ещё 1 комментарий
18

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

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>

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

17

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

  • 0
    Что если мы не используем класс Form? @foreach($elements as $element_each)<option value="{!! $element_each->id !!}">{!! $element_each->name !!}</option>@endforeach выдает ошибку.
  • 0
    Если вы используете класс формы, вы должны установить фасад. Это не работает без этого. Google для коллектива формы laravel
Показать ещё 1 комментарий
6

контроллер

 $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')) !!}
  • 1
    С этим классом выражений -> управление формой не работает. Naing Win ответ с {!! Form :: select ('item_id', $ items, null, ['class' => 'form-control']) !!} работает
5

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

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

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>
4

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']) }}
  • 1
    Вы действительно должны добавить некоторое объяснение того, почему это должно работать - вы также можете добавить код, а также комментарии в самом коде - в его текущей форме, он не дает никакого объяснения, которое может помочь остальному сообществу понять, что Вы сделали, чтобы решить / ответить на вопрос. Это особенно важно для более старого вопроса и вопросов, на которые уже есть ответы. Вы также должны приложить некоторые усилия, чтобы правильно отформатировать код в вашем посте.
2

Laravel 5. *

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

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

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

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

Для Laravel 5:

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

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

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

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

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

  • 4
    Почему ОП "попробовать это"? Хороший ответ всегда будет содержать объяснение того, что было сделано и почему это было сделано таким образом, не только для ФП, но и для будущих посетителей SO.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню