Skip to content

Instantly share code, notes, and snippets.

@msurguy
Last active August 20, 2023 18:02
Show Gist options
  • Star 60 You must be signed in to star a gist
  • Fork 32 You must be signed in to fork a gist
  • Save msurguy/5138788 to your computer and use it in GitHub Desktop.
Save msurguy/5138788 to your computer and use it in GitHub Desktop.
Dynamic dropdown in Laravel, let's say you have multiple drop downs (selects), you click on one and the contents of the other need to be dynamically changed. One solution is to dynamically load JSON from the API and change the dropdown dynamically depending on the user choice.
CREATE TABLE `makers` (
`id` int(10) unsigned NOT NULL,
`name` varchar(255) NOT NULL,
`description` varchar(255) NOT NULL,
`created_at` datetime NOT NULL,
`updated_at` datetime NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
--
-- Dumping data for table `makers`
--
INSERT INTO `makers` (`id`, `name`, `description`, `created_at`, `updated_at`) VALUES
(1, 'Toyota', 'Toyota cars', '2013-03-11 00:00:00', '2013-03-11 00:00:00'),
(2, 'Honda', 'Honda cars', '2013-03-11 00:00:00', '2013-03-11 00:00:00'),
(3, 'Mercedes', 'Mercedes cars', '2013-03-11 00:00:00', '2013-03-11 00:00:00');
-- --------------------------------------------------------
--
-- Table structure for table `models`
--
CREATE TABLE `models` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`maker_id` int(10) unsigned NOT NULL,
`name` varchar(255) NOT NULL,
`description` varchar(255) NOT NULL,
`created_at` datetime NOT NULL,
`updated_at` datetime NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=11 ;
INSERT INTO `models` (`id`, `maker_id`, `name`, `description`, `created_at`, `updated_at`) VALUES
(1, 2, 'Honda S2000', '', '2013-03-11 22:32:07', '2013-03-11 22:32:07'),
(2, 2, 'Civic', '', '2013-03-11 22:32:46', '2013-03-11 22:32:46'),
(3, 2, 'Fit', '', '2013-03-11 22:34:35', '2013-03-11 22:34:35'),
(4, 1, 'asdf asdf', '', '2013-03-11 22:35:31', '2013-03-11 22:35:31'),
(5, 1, 'Yaris', '', '2013-03-11 22:36:01', '2013-03-11 22:36:01'),
(6, 1, 'Corolla', '', '2013-03-11 22:36:23', '2013-03-11 22:36:23'),
(7, 1, 'Camry', '', '2013-03-11 22:36:31', '2013-03-11 22:36:31'),
(8, 3, 'SLK 500', '', '2013-03-11 22:36:47', '2013-03-11 22:36:47'),
(9, 3, 'C300', '', '2013-03-11 22:36:50', '2013-03-11 22:36:50'),
(10, 2, 'another item', '', '2013-03-11 22:36:52', '2013-03-11 22:36:52');
<?php
class Maker extends Eloquent {
public function models(){
return $this->has_many('Model');
}
}
?>
<?php
class Model extends Eloquent {
public function maker(){
return $this->belongs_to('Maker');
}
}
?>
Route::get('api/dropdown', function(){
$input = Input::get('option');
$maker = Maker::find($input);
$models = $maker->models();
return Response::eloquent($models->get(['id','name']));
});
jQuery(document).ready(function($){
$('#make').change(function(){
$.get("{{ url('api/dropdown')}}",
{ option: $(this).val() },
function(data) {
var model = $('#model');
model.empty();
$.each(data, function(index, element) {
model.append("<option value='"+ element.id +"'>" + element.name + "</option>");
});
});
});
});
<h1>Dropdown demo</h1>
{{ Form::open() }}
<select id="make" name="make">
<option>Select Car Make</option>
<option value="1">Toyota</option>
<option value="2">Honda</option>
<option value="3">Mercedes</option>
</select>
<br>
<select id="model" name="model">
<option>Please choose car make first</option>
</select>
{{ Form::close();}}
@jasonherndon
Copy link

I modified this a little bit and got it to work well:

routes.php

Route::get('/myurl/', ['as' => 'items.duplicate', 'uses' => 'ItemsController@duplicate']);

ItemsController.php

    public function duplicate()
    {
        $user = Input::get('option');
        $items = Items::where('user_id', '=', $user)->lists('name', 'id');
        return Response::make($items);
    }

show.blade.php

<select id="userselect" name="userselect">
    <option>Select User</option>
    @foreach ($users as $user)
      <option value="{{ $user->id }}">{{ $user->name}}</option>
    @endforeach
   </select>

   <select id="itemselect" name="itemselect">
       <option>Please choose user first</option>
   </select>


<script>
    jQuery(document).ready(function($){
        $('#itemselect').change(function(){
                $.get("{{ url('myurl')}}", 
                { option: $(this).val() }, 
                function(data) {

                    var item = $('#itemselect');
                    item.empty();

                    $.each(data, function(key, value) {
                        item.append("<option value='"+ key +"'>" + value + "</option>");
                    });

                });
        });


    });

</script>

@goranata
Copy link

I've done everything as suggested, and I get this error: Call to a member function models() on a non-object.

Anybody might have an idea, what the that I'm facing is about ?

@gbelot2003
Copy link

I don't understand how Laravel would't have a Form::selectdb(field.id) where field.id is the key relationship, to generate the drop down select box without relay on jq??? I mean "Kumbiaphp" is a more more less developed framework, but already has it since years!!!!

@sparkandy
Copy link

I keep having this error.. Symfony \ Component \ HttpKernel \ Exception \ NotFoundHttpException

when I look at the console I see this $others = $this->checkForAlternateVerbs($request);

    if (count($others) > 0)
    {
        return $this->getOtherMethodsRoute($request, $others);
    }

    throw new NotFoundHttpException;
}

from the url.. Apprently, my route is wrong...

@josephrexme
Copy link

For those that keep having an issue with this, I have simplified it in step 3 of the article here http://josephrex.me/implementing-dynamic-drop-down-or-dependent-list-in-laravel4/

@yassinali
Copy link

Can anyone send the me the full code with the api please.

@elbiheiry
Copy link

i keep having this error:
ErrorException in helpers.php line 686:
Object of class stdClass could not be converted to string
how can i solve it

@ChamandeepSingh
Copy link

I got an error 500 Internal Server Error

i put all changes, please suggest if you have solution

@scoutkirkolson
Copy link

Is it possible to keep (or refill) the dropdown options and the dropdown value when the page reloads, say after a validation that didn't pass?

@gildniy
Copy link

gildniy commented Feb 10, 2016

For L5.2 users remember to add 'Input' => Illuminate\Support\Facades\Input::class, in your config/app.php it was removed! And run php artisan ide-helper:generate

@gildniy
Copy link

gildniy commented Feb 26, 2016

Here I avail a practical example of this on Laravel 5.2 fresh installation, as a package!

@mandeepkumar0856
Copy link

i have a question here if i have four table like as users,repo,remote,cake. and user_id is relationship with rest of all table.when i want to add a new entry in any of rest three table then user_id show in dropdown and it show the total number of user _id here.
ex. in my cake table i have 5 column like as id,title,status,user_id,created_at,updated_at
and now i want to add,edit any entry in cake table .then here user_id showin dropdown and when i click any one then it save in database table.Please tell me here for controller,view

@aklimaruhina
Copy link

please help editing selected value using ajax request.

@fhfg
Copy link

fhfg commented Apr 11, 2017

please help editing selected value using ajax request.

@sujatacodebrew
Copy link

<script> jQuery(document).ready(function($){ $('.country').change(function(){ $.get("{{ url('/dropdown')}}", { option: $(this).val() }, function(data) { $('city').empty(); $.each(data, function(index, element) { city.append("" + element.name + ""); }); }); }); }); </script>

Hi this code is not working, when we click on the city dropdown it doesn't display anything but the country dropdown is working fine. Can you explain Please help

@esuraj99
Copy link

How can i save the result in database

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment