web-dev-qa-db-fra.com

Laravel-5 comment remplir une boîte de sélection à partir d'une base de données avec id et name

Je veux créer une boîte de sélection comme celle ci-dessous en utilisant illuminate\html :

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

J'ai essayé ceci dans mon contrôleur:

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

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

Et à mon avis ceci:

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

Le problème est qu'au lieu de $item->name affiche toutes les informations de l'entité.

48
borracciaBlu

Laravel fournit un constructeur de requêtes avec la fonction lists ()

Dans votre cas, vous pouvez remplacer votre code

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

avec

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

En outre, vous pouvez également le chaîner avec un autre générateur de requêtes.

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

source: http://laravel.com/docs/5.0/queries#selects


Mise à jour pour Laravel 5.2

Merci beaucoup @jarry. Comme vous l'avez mentionné, la fonction de Laravel 5.2 devrait être

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

ou

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

ref: https://laravel.com/docs/5.2/upgrade#upgrade-5.2. - consultez les listes de vétustes

95
mininoz

Laravel> = 5.3 method lists () est obsolète, utilisez pluck()

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

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

Cela vous donnera une zone de sélection avec les mêmes options de sélection que les numéros d'identification dans DB.

par exemple, si vous avez ceci dans votre table de base de données:

id name
1  item1
2  item2
3  item3
4  item4

dans la boîte de sélection, ce sera comme ça

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

J'ai découvert que pluck renvoie maintenant une collection, et vous devez ajouter -> toArray () à la fin de pluck ... donc comme ceci: pluck('name', 'id')->toArray();

23
lewis4u

Il suffit de changer votre contrôleur comme suit:

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

Et votre vue sur:

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

J'espère que cela résoudra votre problème

20
Sohel0415

contrôleur

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

compact ('campaignStatus') donnera le résultat [id => status]; // exemple [1 => 'en attente']

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

Voir

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

Dans votre contrôleur, ajoutez,

public function create()
{
    $items = array(
        'itemlist' =>  DB::table('itemtable')->get()
      );

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

Et à votre avis, utilisez

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

Dans la zone de sélection, ce sera comme ça,

<select>
 <option value="1">item1</option>
 <option value="2">item2</option>
 <option value="3">item3</option>
 ...
</select>
6
BIBIN K ONANKUNJU

Laravel utilise array pour Form::select. J'ai donc passé tableau comme ci-dessous:

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

foreach ($datas as $data)
{
    $items[$data->id] = $data->name;
}

return \View::make('your view', compact('items',$items));

A votre avis:

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

Laravel 5.3 utilise pluck ($ value, $ key)

La valeur $ est affichée dans votre liste déroulante et $ key est id

contrôleur

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

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

vue

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

J'ai ajouté toArray() après pluck

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

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

Laravel 5. *

Dans votre contrôleur:

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

A votre avis:

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

Désolé pour la réponse tardive

Évidemment, la méthode lists a été deprecated dans Laravel, mais vous pouvez utiliser la méthode Pluck.

Par exemple:

Laravel 5.7

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

et dans la vue si vous êtes FORM composants juste passer comme

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

si va générer le menu déroulant

mais j'ai une situation pour montrer que sélectionner le pays comme première option et comme valeur nulle

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

alors j'ai parlé de

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

et corrigé cela, mais plus tard, si je veux changer cela, je déteste le changer dans la vue

Donc, ont créé la fonction d'assistance basée sur https://stackoverflow.com/a/51324218/8487424 et placée dans le modèle de pays

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;
        }

et dans le contrôleur

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

et enfin dans la vue

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

et le résultat est comme prévu, mais je recommande fortement d'utiliser la méthode pluck()

3
Manojkiran.A

Pour Laravel 5:

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

Poussez un élément au début de la collection.

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

Beaucoup a déjà été dit, mais gardez à l'esprit qu'il y a des moments où vous ne voulez pas exporter tous les enregistrements de la base de données dans votre champ de sélection ... Exemple clé J'ai travaillé sur ce site de gestion d'école où Je dois sortir toutes les catégories du tableau d’affichage dans une instruction select. De mon contrôleur c'est le code que j'ai écrit

Tableau d'affichage :: groupBy () -> pluck ('catégorie') -> get ();

De cette façon, vous obtenez un enregistrement distinct, car ils ont été regroupés, donc aucune répétition d’enregistrements

0
Dawood Iddris

Essaye celui-là. Sans utiliser contrôleur

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

J'essayais de faire la même chose dans Laravel 5.8 et j'ai eu une erreur concernant le fait d'appeler plumer statiquement. Pour ma solution, j'ai utilisé ce qui suit. La collection s'appelait clairement 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>
0
PhPGuy

Pour renseigner la liste déroulante dans laravel, nous devons suivre les étapes ci-dessous.

De contrôleur nous devons obtenir la valeur comme ceci:

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

Et le même que nous pouvons afficher en vue:

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

Cette valeur de clé dans la liste déroulante, vous pouvez utiliser selon vos besoins. J'espère que ça peut aider quelqu'un.

0
S Debasish Nayak