Be part of JetBrains PHPverse 2026 on June 9 – a free online event bringing PHP devs worldwide together.

zamdev's avatar

Can't get select value - Laravel 5.5

Hello guys, I am new here and new Laravels programmer generally. I need you advice about how to get select option and filter results based on this.

Blade:

<select name="sortJobs" id="sortJobs">
    <option value="Software development">Software development</option>
    <option value="Design & UX">Design & UX</option>
    <option value="Marketing">Marketing</option>
    <option value="Customer support">Customer support</option>
    <option value="Other">Other</option>
</select>

@foreach ($jobs as $job)
    <p>{{ $job->company }}</p>
    ...etc
@endforeach

Controller:

<?php
namespace App\Http\Controllers\Website;

use Illuminate\Support\Facades\Input;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
use App\Job;
use DB;

class WelcomeController extends Controller
{
    /* Show the welcome page
    @return \Illuminate\Http\Response
    */

    public function index(Request $request)
    {
        $category = $request->get('sortJobs');

        $query = DB::table('jobs')->where('visible', 1);

        if ($category !== null ) {
            $query->where('category', $category);
        }
        
        $jobs = $query->paginate(15);
        return view("website.welcome", compact('jobs'));
    }
}

I have no JavaScript for this, do I need one?

dd($request->all()); returns NULL.

'Job' is table and 'Category' is column for every 'Job' in database.

What is wrong with this code? How to make it work?

Thanks in advance!

0 likes
14 replies
automica's avatar

You’ll only get values in your $request object as a result of a form submission.

If you want to filter your select you’ll need to wrap it in a form and submit a t to you index method which will give you access to the appropriate value you want to filter on

1 like
hubuhunlaracasti's avatar

You should use form element as mentioned by @brightstormhq

in view:


<form action="uri" method="post">
<select name="sortJobs" id="sortJobs">
    <option value="Software development">Software development</option>
    <option value="Design & UX">Design & UX</option>
    <option value="Marketing">Marketing</option>
    <option value="Customer support">Customer support</option>
    <option value="Other">Other</option>
</select>
</form>

in route:


Route::post('uri', 'WelcomeController@index');

zamdev's avatar

Ok, I have changed POST to GET and added submit to form. Now, it is working!

HTML:

<form action="uri" method="GET">
   <select name="sortJobs" id="sortJobs">
     <option value="Software development">Software development</option>
     <option value="Design & UX">Design & UX</option>
     <option value="Marketing">Marketing</option>
     <option value="Customer support">Customer support</option>
     <option value="Other">Other</option>
   </select>
   <input type="submit" value="Submit Form" />
</form>

Routes:

Route::group(['namespace' => 'Website', 'as' => 'website::'], function() {
    Route::get('uri', 'WelcomeController@index');
    Route::get('/', 'WelcomeController@index')->name('welcome');
    Route::get('/add', 'PagesController@add')->name('add');
});

Do I need submit button? Is this make good or may I correct to code looks better?

Donny5300's avatar

Your form should be as below. If you use the GET method, then you dont need a CSRF token. More information about the CSRF: https://laravel.com/docs/master/csrf

<form action="uri" method="post">
   @csrf
   <select name="sortJobs" id="sortJobs">
     <option value="Software development">Software development</option>
     <option value="Design & UX">Design & UX</option>
     <option value="Marketing">Marketing</option>
     <option value="Customer support">Customer support</option>
     <option value="Other">Other</option>
   </select>
<button type="submit">Send my form!</button>
</form>

What you also need is the FormRequest class which should be extended. I.e.:

class SortJobsRequest extends \Illuminate\Foundation\Http\FormRequest {
    public function authorize(){
        // This method should return true if this request is allowed
    }

    public function rules(){
        // Return a array with validation rules. I.e.:

        return [
            'sortJobs' => 'required'
        ];
    }
}
hubuhunlaracasti's avatar

Sorry I forgot, you also have to use submit input and @csrf

in view:


<form action="uri" method="POST">
    @csrf
    <select name="sortJobs" id="sortJobs">
        <option value="Software development">Software development</option>
        <option value="Design & UX">Design & UX</option>
        <option value="Marketing">Marketing</option>
        <option value="Customer support">Customer support</option>
        <option value="Other">Other</option>
    </select>
    <input type="submit"></input>
</form>


in route:


Route::post('uri', 'WelcomeController@index');

zamdev's avatar

Ok, it is working with my corrects. How to make it AJAX working and keep selected value in select? How to make my URL more beautify and SEO friendly? Not they look like: /uri?_token=N797Tw61BaLlnuISCWZAqHPGYtXoXswXHDZhJiye&sortJobs=Software+development

Donny5300's avatar

Everything after the question mark wont be indexed by Google.

zamdev's avatar

Now I am making AJAX for this, but can't get data. It append whole content from website. How to append only filtered data?

   $(document).on('submit', '#filterJobs', function (e) {
        e.preventDefault();
        $.ajax({
            type:'GET',
            data: $(this).attr('action'),
            url: $(this).data('action'),
            contentType: false,
            processData: false,
            success: function (data) {
                $('.job').remove();
                var $board = $('.board');
                $board.append(data);
            },
            error: function (error) {
                console.log(error);
            }
        });
    });
hubuhunlaracasti's avatar

in view:


<html>
<head>
<meta name="csrf-token" content="{{ csrf_token() }}" /> 
</head>
<body>
    <select id="sortJobs">
        <option value="Software development">Software development</option>
        <option value="Design & UX">Design & UX</option>
        <option value="Marketing">Marketing</option>
        <option value="Customer support">Customer support</option>
        <option value="Other">Other</option>
    </select>
    <button id="submit">Submit</button>

    <div id="sortJob"></div>


<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<script>
 $(document).ready(function(){
            var CSRF_TOKEN = $('meta[name="csrf-token"]').attr('content');
            $("#submit").click(function(){
                $.ajax({
                    url: '/uri',
                    type: 'POST',
                    data: {_token: CSRF_TOKEN, message:$("#sortJobs").val()},
                    dataType: 'JSON',
                    success: function (data) { 
                        $("#sortJob").html(data); 
                    }
                }); 
            });
       });    
</script>
</body>
</html>

in controller:


use Illuminate\Http\Request;


class WelcomeController extends Controller
{
       
    public function index(Request $request)
    {
               
      return response()->json($request->message);
    }

}

Cronix's avatar

@ismayil You didn't prevent the default form submit, so it will submit 2x (once regular and once ajax).

zamdev's avatar

@Ismail @Cronix but if I not add form element, then $category will return NULL. It doesn't work withour .

Please or to participate in this conversation.