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
отображается вся информация объекта.
Ответы
Ответ 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>