Model grid filters


model-gridProvides a set of data filters:


    // Remove the default id filter

    // Add a column filter
    $filter->like('name', 'name');

    //... additional filter options

Show Filter Open

Adjust the style of the filter query panel, from the original pop-up modal to the embedded table header, click the filter button to expand the display, the default is not expanded, you can let it expand by default in the following way:

// Operate on the `$grid` instance

// Or manipulate the `$filter` instance in the filter callback

Define the scope of the query

You can define your most commonly used query as a query scope, which will appear in the drop-down menu of the filter button. Here are a few examples:

$filter->scope('male', 'Male')->where('gender', 'm');

// Multiple conditional query
$filter->scope('new', 'Recently modified')
    ->whereDate('created_at', date('Y-m-d'))
    ->orWhere('updated_at', date('Y-m-d'));

// Relationship query
$filter->scope('address')->whereHas('profile', function ($query) {

$filter->scope('trashed', 'Soft deleted data')->onlyTrashed();

The first parameter of the scope method is the key of the query. It will appear in the url parameter. The second parameter is the label of the drop-down menu item. If not filled, the first parameter will be displayed as the label.

You can call any eloquent query condition after the scope method. The effect is referenced Demo

Filter types

Currently supported filter types are the following:


sql: ... WHEREcolumn= ""$input""

$filter->equal('column', $label);

Not equal

sql: ... WHEREcolumn!= ""$input""

$filter->notEqual('column', $label);


sql: ... WHEREcolumnLIKE "%"$input"%"

$filter->like('column', $label);


sql: ... WHEREcolumnILIKE "%"$input"%"

$filter->ilike('column', $label);


Equal to like query


starts with

Query title field data starting with input


starts with

Query title field data ending with input


Greater then

sql: ... WHEREcolumn> "$input"

$filter->gt('column', $label);

Less than

sql: ... WHEREcolumn< "$input"

$filter->lt('column', $label);


sql: ... WHEREcolumnBETWEEN "$start" AND "$end"

$filter->between('column', $label);

// set datetime field type
$filter->between('column', $label)->datetime();

// set time field type
$filter->between('column', $label)->time();


sql: ... WHEREcolumnin (...$inputs)

$filter->in('column', $label)->multipleSelect(['key' => 'value']);


sql: ... WHEREcolumnnot in (...$inputs)

$filter->notIn('column', $label)->multipleSelect(['key' => 'value']);


sql: ... WHERE DATE(column) = "$input"

$filter->date('column', $label);


sql: ... WHERE DAY(column) = "$input"

$filter->day('column', $label);


sql: ... WHERE MONTH(column) = "$input"

$filter->month('column', $label);


sql: ... WHERE YEAR(column) = "$input"

$filter->year('column', $label);


You can use where to build more complex query filtering

sql: ... WHEREtitleLIKE "%$input" ORcontentLIKE "%$input"

$filter->where(function ($query) {

    $query->where('title', 'like', "%{$this->input}%")
        ->orWhere('content', 'like', "%{$this->input}%");

}, 'Text');

sql: ... WHERErate>= 6 ANDcreated_at= {$input}:

$filter->where(function ($query) {

    $query->whereRaw("`rate` >= 6 AND `created_at` = {$this->input}");

}, 'Text');

Relationship query, query the corresponding relationship profile field:

$filter->where(function ($query) {

    $query->whereHas('profile', function ($query) {
        $query->where('address', 'like', "%{$this->input}%")->orWhere('email', 'like', "%{$this->input}%");

}, 'Address or mobile');

Field type

The default field type is text input, set placeholder for text input:

$filter->equal('column')->placeholder('Please input...');

You can also restrict the user input format by using some of the following methods:







// $options refer to
$filter->equal('column')->decimal($options = []);

// $options refer to
$filter->equal('column')->currency($options = []);

// $options refer to
$filter->equal('column')->percentage($options = []);

// $options refer to
$filter->equal('column')->inputmask($options = [], $icon = 'pencil');


$filter->equal('column')->select(['key' => 'value'...]);

// Or from the api to obtain data, api format reference model-form `select` component


Generally used in conjunction with in andnotIn need to query the array of two types of inquiries can also be used in the type type of query:

$filter->in('column')->multipleSelect(['key' => 'value'...]);

// // Or from the api to obtain data, api format reference model-form `multipleSelect` component


The more common scenario is the selection of categories

    ''   => 'All',
    0    => 'Unreleased',
    1    => 'Released',


The more common scene is do the scope query with whereIn:

    'm'    => 'Male',
    'f'    => 'Female',


Use date and time components,$options parameter and value reference flatpickr


// `date()` equals to `datetime(['format' => 'YYYY-MM-DD'])`

// `time()` equals to `datetime(['format' => 'HH:mm:ss'])`

below functions just a regular text field

// `day()` equals to `datetime(['format' => 'DD'])`

// `month()` equals to `datetime(['format' => 'MM'])`

// `year()` equals to `datetime(['format' => 'YYYY'])`

Complex query filter

You can use the $this->input to trigger complex custom queries:

$filter->where(function ($query) {
    switch ($this->input) {
        case 'yes':
            // custom complex query if the 'yes' option is selected
        case 'no':
}, 'Label of the field', 'name_for_url_shortcut')->radio([
    '' => 'All',
    'yes' => 'Only with relationship',
    'no' => 'Only without relationship',

Multi-column layout

If there are too many filters, the page will be pulled long, which will affect the look and feel of the page. This version will support the multi-column layout of the filter. For example, 6 filters are displayed in two columns.

    $grid->filter(function ($filter) {

        $filter->setCols(4, 6); // sets the widths of label / field

        $filter->column(1/2, function ($filter) {
            $filter->like('title', 'title');
            $filter->group('status', function ($group) {
                $group->gt('greater than');
                $group->lt('less than');
                $group->nlt('not less than');
                $group->ngt('not greater than');
                $group->equal('equal to');

        $filter->column(1/2, function ($filter) {
            $filter->where(function ($query) {
                $query->whereHas('tags', function ($query) {
            }, 'Has Tags')->checkbox([
                1    => 'Yes'


By default, there will be a filter for the primary key field in the first column, and all three filters for the left and right will have a total of 6 filters.

The first parameter of the column method sets the column width, which can be set to the scale 1/2 or 0.5, or the width of the grid column of the bootstrap is 6. If it is three columns, it can be set to 1/3.or 4


Filter group

Sometimes you need to set multiple filtering methods for the same field, you can do it in the following way.

$filter->group('rate', function ($group) {
    $group->gt('greater than');
    $group->lt('less than');
    $group->nlt('not less than');
    $group->ngt('not greater than');
    $group->equal('equal to');

There are several ways to call

// equals

// not equal to

// more than the

// less than

// greater or equal to

// less than or equal to

// match

// Complex conditions

// like query

// like query

// ilike query

// start with the input

// end with the input