I'm using Laravel Collective Form builder in my view and i'm populating this select box from a table in my DB like this
I am having an issue with my values not matching up and my dropdown is also giving me the values as an array...
Here's what I have in my PostsController:-
public function edit(Post $post)
{
$categories = Category::all()->pluck('title', 'id')->toArray();
return view('posts.edit')->withPost($post)->withCategories($categories);
}
and here's my view edit.blade.php:-
{{ Form::label('category_id', 'Category :')}}
{!! Form::select('category_id', $categories, null, ['class' => 'form-control']) !!}
So I need little help?
Here's the value issue I was talking about:
enter image description here
Here's the array issue I was talking about:
enter image description here
no need to use toArray() pluck method automatically create an array.
try this
$categories = Category::pluck('title', 'id');
First of all your code seems like not proper.
$categories = Category::all()->pluck('title', 'id')->toArray();
should be
$categories = Category::pluck('title', 'id')->toArray();
Firstly update you controller function. I think that will help:-
public function edit(Post $post)
{
$categories = Category::pluck('title', 'id')->toArray();
return view('posts.edit', [
'post' => $post,
'categories' => $categories
]);
}
Try this code and let me know need help.
How can I show more than the first name? Select and pluck use key => value method (via id here), where do I write other columns I would like to bring into view ( such as last_name, paygrade, etc.)?
I would like to keep using the eloquent convention and show more info on the selected option.
Controller
$users = User::select('id', 'first_name')->pluck('first_name', 'id');
Blade
{!! Form::select('worker_id', $users, isset($users) ? $users : null, array('class' => 'form-control chosen-select', 'data-placeholder'=> 'Worker...', 'multiple' => 'multiple')) !!}
you can use this:
$users = User::selectRaw('id, CONCAT(first_name," ",last_name) as full_name')->pluck('full_name', 'id');
or this:
$users = User::select('id', DB::raw("concat(first_name, ' ', last_name) as full_name")->pluck('full_name', 'id');
How i do the query to works like this example:$model->model2->attribute
<div class="form-group">
{!! Form::label('Route name') !!}
{!! Form::text('name', ( isset($climb->route->name) ? $climb->route->name : null ), array('class'=>'form-control' )) !!}
</div>
You could try using your model in the view as in a dictionary, add something like this in your controller.
$model = Model::find($id);
$model['model2'] = $model->model2;
return view('your_view', ['model' => $model]);
For this I assume you already prepared your relationship in your model, doing that for your real models should make the view work this way
<div class="form-group">
{!! Form::label('Route name') !!}
{!! Form::text('name', ( isset($climb['route']['name']) ? $climb['route']['name'] : null ), array('class'=>'form-control' )) !!}
</div>
Create a relation:
Having:
class Comment extends Model
{
/**
* Get the post that owns the comment.
*/
public function post()
{
return $this->belongsTo('App\Post');
Then thou shall call lika:
$comment = App\Comment::find(1);
echo $comment->post->title;
https://laravel.com/docs/5.2/eloquent-relationships#one-to-many
It's one many, not one one I think
I am using Laravel HTML component to create a dropdown to list all the groups to which an user can belong.
The list of groups comes from a Groups table.
Currently in my controller my code looks like
$groups = array();
$groupModels = Group::all(['id', 'name']);
foreach ($groupModels as $groupModel) {
$groups[$groupModel->id] = $groupModel->name;
}
return view('myview', compact('groups'));
and in my view I have the following code to create the dropdown
{!! Form::select('group', $groups, null, ['class' => 'form-control']) !!}
This works, but I am trying to see if there is a way to avoid the foreach loop and directly convert the list of Models into an array. Is it possible?
Use pluck() method:
$groups = Group::pluck('name', 'id');
return view('myview', compact('groups'));
I want to create a select box like the one below using illuminate\html :
<select>
<option value="$item->id">$item->name</option>
<option value="$item->id">$item->name</option>
</select>
In my controller I tried this:
public function create()
{
$items = Items::all(['id', 'name']);
return view('prices.create', compact('id', 'items'));
}
And in my view this:
<div class="form-group">
{!! Form::Label('item', 'Item:') !!}
{!! Form::select('item_id', $items, null, ['class' => 'form-control']) !!}
</div>
The issue is that instead of $item->name is displaying all the info of the entity.
Laravel provides a Query Builder with lists() function
In your case, you can replace your code
$items = Items::all(['id', 'name']);
with
$items = Items::lists('name', 'id');
Also, you can chain it with other Query Builder as well.
$items = Items::where('active', true)->orderBy('name')->lists('name', 'id');
source: http://laravel.com/docs/5.0/queries#selects
Update for Laravel 5.2
Thank you very much #jarry. As you mentioned, the function for Laravel 5.2 should be
$items = Items::pluck('name', 'id');
or
$items = Items::where('active', true)->orderBy('name')->pluck('name', 'id');
ref: https://laravel.com/docs/5.2/upgrade#upgrade-5.2.0 -- look at Deprecations lists
Laravel >= 5.3 method lists() is deprecated use pluck()
$items = Items::pluck('name', 'id');
{!! Form::select('items', $items, null, ['class' => 'some_css_class']) !!}
This will give you a select box with same select options as id numbers in DB
for example if you have this in your DB table:
id name
1 item1
2 item2
3 item3
4 item4
in select box it will be like this
<select>
<option value="1">item1</option>
<option value="2">item2</option>
<option value="3">item3</option>
<option value="4">item4</option>
</select>
I found out that pluck now returns a collection, and you need to add ->toArray() at the end of pluck...so like this: pluck('name', 'id')->toArray();
Just change your controller to the following:
public function create()
{
$items = Subject::all(['id', 'name']);
return View::make('your view', compact('items));
}
And your view to:
<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>
Hope this will solve your problem
Controller
$campaignStatus = Campaign::lists('status', 'id');
compact('campaignStatus') will result in [id=>status]; //example [1 => 'pending']
return view('management.campaign.index', compact('campaignStatus'));
View
{!! Form::select('status', $campaignStatus, array('class' => 'form-control')) !!}
In your controller, add,
public function create()
{
$items = array(
'itemlist' => DB::table('itemtable')->get()
);
return view('prices.create', $items);
}
And in your view, use
<select name="categories" id="categories" class="form-control">
#foreach($itemlist as $item)
<option value="{{ $item->id }}">{{ $item->name }}</option>
#endforeach
</select>
In select box, it will be like this,
<select>
<option value="1">item1</option>
<option value="2">item2</option>
<option value="3">item3</option>
...
</select>
Laravel use array for Form::select. So I passed array like below:
$datas = Items::lists('name', 'id');
$items = array();
foreach ($datas as $data)
{
$items[$data->id] = $data->name;
}
return \View::make('your view', compact('items',$items));
In your view:
<div class="form-group">
{!! Form::label('item', 'Item:') !!}
{!! Form::select('item_id', $items, null, ['class' => 'form-control']) !!}
</div>
I have added toArray() after pluck
$items = Item::pluck('name', 'id')->toArray();
{{ Form::select('item_id', [null=>'Please Select'] + $items) }}
Laravel 5.3 use pluck($value, $key )
$value is displayed in your drop list and $key is id
controller
$products = Product::pluck('name', 'id');
return view('main.index', compact('products'));
view
{{ Form::select('id', $products, null, ['class' => 'form-control']) }}
Laravel 5.*
In your controller:
$items= Items::pluck('name', 'id')->toArray();
return view('your view', compact('items', $items));
In your view:
{{ Form::select('organization_id', $items, null, []) }}
Sorry for the late reply
Obviously lists method has been deprecated in Laravel, but you can use the pluck method.
For Eg:
Laravel 5.7
public function create()
{
$countries = Country::pluck('country_name','id');
return View::make('test.new')->with('countries', $countries);
}
and in the view if you are FORM components just pass as
{{ Form::select('testname',$countries,null,['class' => 'required form-control select2','id'=>'testname']) }}
if will generate the dropdown
but i have a situation to show that select country as the first option and as null value
<option value="" selected="selected">--Select Country--</option>
so I have referred to
https://stackoverflow.com/a/51324218/8487424
and fixed this, but in later times if I want to change this I hate being changing it in the view
So have created the helper function based on https://stackoverflow.com/a/51324218/8487424 and placed in the 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;
}
and in controller
public function create()
{
$countries = Country::toDropDown('countries','name','id','--Select Country--');
return View::make('test.new')->with('countries', $countries);
}
and finally in the view
{{ Form::select('testname',$countries,null,['class' => 'required form-control select2','id'=>'testname']) }}
and the result is as expected, but I strongly recommend to use pluck() method
For Laravel 5 :
$items = Items::lists('name', 'id');
Push an item onto the beginning of the collection.
$items->prepend($value, $key = null);
To populate the drop-down select box in laravel we have to follow the below steps.
From controller we have to get the value like this:
public function addCustomerLoyaltyCardDetails(){
$loyalityCardMaster = DB::table('loyality_cards')->pluck('loyality_card_id', 'loyalityCardNumber');
return view('admin.AddCustomerLoyaltyCardScreen')->with('loyalityCardMaster',$loyalityCardMaster);
}
And the same we can display in view:
<select class="form-control" id="loyalityCardNumber" name="loyalityCardNumber" >
#foreach ($loyalityCardMaster as $id => $name)
<option value="{{$name}}">{{$id}}</option>
#endforeach
</select>
This key value in drop down you can use as per your requirement.
Hope it may help someone.
Many has been said already but keep in mind that there are a times where u don't want to output all the records from the database into your select input field ..... Key example I have been working on this school management site where I have to output all the noticeboard categories in a select statement. From my controller this is the code I wrote
Noticeboard:: groupBy()->pluck('category')->get();
This way u get distinct record as they have been grouped so no repetition of records
I was trying to do the same thing in Laravel 5.8 and got an error about calling pluck statically. For my solution I used the following. The collection clearly was called 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>
Try this one. Without using controller
{{ Form::select('apartment_id', \App\Apartment::all()->pluck('apartment_name', 'apartment_id')->toArray(), null,['class'=>'select2 form-control', 'multiple'=>'multiple','required','id' => 'apartment_id']) }}