Laravel 5.4 pluck an entire list - php

In my Laravel model controller I have this:
public function guestInfo($id)
{
$guests = Person::where('id', $id)
->with('languages')
->get();
return view('layouts.visitor', ['guests' => $guests]);
}
in my blade file I have this:
#foreach ($guests as $guest)
some html stuff in here
{!! Form::select('name', $guest->languages->pluck('name')->all(), ['class' => 'form-control']) !!}
more html
#endforeach
Person is a model to a db table "persons" and "languages" is a relative model "belongs to" Person.
In my languages table I have different rows for languages: "english, spanish, etc" each is in it's own row with it's own id.
My goal is to get all the languages to show up. However currently with the above code I only get one language to show up.
Any ideas?

your code will retrieve only that languages which associated with persons. if you want to show all languages, just retrieve them as id => name pairs and pass to your view.
$guests = Person::where('id', $id)->get();
$languagess = Language::pluck('name', 'id);
and then do foreach with $languages
#foreach ($languages as $key => $val)
{!! Form::select('name', $key, ['class' => 'form-control']) !!}
#endforeach

I ended up doing it like this with some help from #devnull Ψ. Not exactly as he suggested but it gave me some direction.
Controller:
public function guestInfo($id)
{
$guests = Person::where('id', $id)
->with('languages')
->get();
$languages = Language::pluck('name')->toArray();
return view('layouts.visitor', ['guests' => $guests, 'languages' => $languages]);
}
Then in my blade:
{!! Form::select('name', $languages, 'name', ['placeholder' => '<select>','class'=>'form-control']) !!}

Related

Form select box {!!Form::select()!!} Laravel

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.

Laravel Pluck - how to get more than one field

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

Laravel 5.2 relationship one to one query

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

Convert collection of models into an array with id as key

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

Laravel-5 how to populate select box from database with id value and name value

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']) }}

Categories