user267019
user267019

Reputation: 109

Issue when trying to populate a drop-down with database values

I am using the following HTML to show a selected drop down with values from the database and rest of the others in the list. It shows the selected name correctly but the selected is also displayed in the list.

How to remove the second time show selected name in the drop down list? Is this a good way to use drop down menu? Here Jobcategory and Jobdetails are associated.

Im using Laravel 4.2 and this is the HTML:

// view drop down form to save data

<div class="large-6 columns">
 <label>Job Category
    <select name="category[]">
    <option value="">Select Category</option>
    @foreach(JobCategory::all() as $jcat)
    <option value="{{ $jcat->id }}">{{ $jcat->name }}</option>
    @endforeach
    </select>
 </label>
</div>

// Edit drop down form to update the selected value

 <div class="large-6 columns">
 <label>Job Category
 <select name="category[]">
 <option value="{{$jobedit->jobcategory->id}}">{{$jobedit->jobcategory->name </option>
 @foreach(JobCategory::all() as $jcat)
 <option value="{{ $jcat->id }}">{{ $jcat->name }}</option>
 @endforeach
 </select>  
 </label>
 </div>

// database table for jobcategories

id | name
1  | Accounting/Finance
2  | Advertisement/Event Mgt.
3  | .....

// after save into jobdetails table

id | jobcategory_id | .......
1  |   5            | ...

I can retrieve the value of jobcategory in the edit form but it shows twice one in the selected value and other in the listed value of all jobcategory. This is the problem and i want only show the selected value and then rest of the others from jobcategory table without duplicate value of selected in the drop down. plz help.

// controller to to edit

public function getJobEdit($id)
{
    $jobedit = JobDetail::find($id);
    return View::make('employers.edit_single_jobs')->with('jobedit', $jobedit);
}

// JobDetail --model

public function jobcategory()
{
    return $this->belongsTo('JobCategory');
}

// JobCategory --model

public function jobdetails()
{
    return $this->hasMany('JobDetail', 'jobcategories');
}   

Upvotes: 1

Views: 707

Answers (2)

Pᴇʜ
Pᴇʜ

Reputation: 57673

Have a look at the Forms & HTML helper of laravel.

Generating A Drop-Down List With Selected Default

echo Form::select('size', array('L' => 'Large', 'S' => 'Small'), 'S');

where the first argument is the name of the select box. The second argument is an array of all entries in the box and the last argument determines which of the array elements is the selected one.

in your case it could look something like this:

{{ Form::select(
    'categoryName', 
    array(
        'Accounting/Finance'       => 'Accounting/Finance', 
        'Advertisement/Event Mgt.' => 'Advertisement/Event Mgt.',
        // to be continued ...
    ),
    '$cat->category_name'
); }}

//Edit

<div class="large-6 columns">
<label>Job Category
{{ Form::select('category[]', ['' => 'Select a category'] + $all_categories, $jobedit->jobcategory->id) }}
</select>  
</label>
</div>

where $all_categories should be an array of all categories as in the first example. You can get this from JobCategory::all().

Upvotes: 1

haakym
haakym

Reputation: 12358

This is how I set up drop-downs in my projects. I prepare the data in my controller (you'd obviously need a route and controller set up for this, I'm assuming you've done that):

Controller

public function index()
{
    $categories = \Category::lists('name', 'id')->orderBy('name'); // assuming you have a Category model

    view('categories', compact('categories'));
}

Then you can use the Forms and HTML helper as Peh mentioned, this isn't available as a default in Laravel 5 so you'd need to add it into your project using composer. To do so either run composer install illuminate/html or add "illuminate/html": "~5.0" to your composer.json file and then run composer install. You'd then need to add 'Illuminate\Html\HtmlServiceProvider' to config/app.php in the providers array then add 'Form' => 'Illuminate\Html\FormFacade' and 'HTML' => 'Illuminate\Html\HtmlFacade' to the aliases array in the same file. Once that's sorted you can use the Form and HTML helper in your view, as so:

View

{{ Form::select('categoryName', ['' => 'Select a category'] + $categories) }}

Your view would need to be saved as filename.blade.php if using the handlebars, otherwise echo it within <?php ?> tags.

Hope that helps you on your way.

Upvotes: 0

Related Questions