musta20/laravel-records-filter

一个用于筛选记录的laravel包

1.0.3 2024-08-24 07:06 UTC

This package is auto-updated.

Last update: 2024-09-24 07:33:18 UTC


README

Laravel记录筛选提供了一种简单直观的方法来筛选和排序Laravel应用程序中的记录。它模仿了Laravel分页器的熟悉语法,使得实现复杂的筛选逻辑变得简单。

要求

此包要求您的应用在视图中包含tailwind和alpinejs。

安装

您可以通过composer安装此包

composer require musta20/laravel-records-filter

如果您没有运行vite dev,请确保重建tailwind资源

yarn vite build

使用此包

在模型中使用HasFilter特质

use Musta20\LaravelRecordsFilter\HasFilter;

class Post extends Model
{
    use HasFactory, HasFilter;

根据您的需求在模型中实现以下函数

排序

以下示例展示了如何实现排序

    public function sortFilterOptions()
    {

        return  [
            [
                "lable" => "oldest",    // label name to display in the filtering form
                "type" => 'ASC',        // sorting type
                "filed" => "created_at" // talbel filed name
            ],
            [
                "lable" => "newest",
                "type" => 'DESC',
                "filed" => "created_at"
            ],
            [
                "lable" => "high price",
                "type" => 'DESC',
                "filed" => "price"
            ],
            [
                "lable" => " lowest price",
                "type" => 'ASC',
                "filed" => "price"
            ],

        ];
    }

根据关系筛选

您可以根据与其他表的关系筛选记录

    public function relationsFilterOptions()
    {
        return [
            [
                'label' => 'auther',     // label name to display in the filtering form
                'label_filed' => 'name', // filed name in the relation tabel
                'id' => 'user_id',      // label name in the relation tabel
                'model' => 'App\Models\User',
            ],
            [
                'label' => 'category',
                'label_filed' => 'name',
                'id' => 'category_id',
                'model' => 'App\Models\category',
            ]
        ];
    }


搜索

您可以通过在搜索函数中定义表名来在记录中进行搜索

    public function searchFields()
    {
        return  [
            'title',
            'body'
        ];
    }

筛选

您可以定义如下的筛选术语

    public function filterOptions()
    {

        return [
            [
                'label' => 'reviewing',     // label name to display in the filtering form
                'type' => 'checkbox',       // checkbox | select | radio group | date | between 
                'filed' => 'article_type',  // filed name in the tabel
                'operation' => '=',         // opertaion type
                'options' => [              // the  values you want to filter based on 
                    'reviewed' => 1,        // the first key will be used as label 
                    'not reviewed' => 0
                ],
            ],
            [
                'label' => 'publish status',
                'type' => 'select',    //checkbox | select | radio group | date | between 
                'filed' => 'is_published',
                'options' => [
                    'drafted' => 0,
                    'publish' => 1
                ]

            ],
            [
                'label' => 'font size',
                'type' => 'radio group', //checkbox | select | radio group | date | between 
                'filed' => 'font_type',
                'options' => [
                    'small' => 10,
                    'big' => 20
                ]

            ],
            [
                'label' => 'issue date',
                'type' => 'date', //checkbox | select | radio group | date | between 
                'filed' => 'created_at',
                'operation' => '='

            ]
            ,
            [
                'label' => 'issue period',
                'type' => 'range', //checkbox | select | radio group | date | between 
                'filed' => 'created_at',
                'inputType' => 'date',//date/number
                'operation' => 'between',
                'options' => [
                    'from',
                    'to'
                ]
            ]
            ,
            [
                'label' => 'price range',
                'type' => 'range', //checkbox | select | radio group | date | between 
                'filed' => 'price',
                'inputType' => 'number',//date/number
                'operation' => 'between',
                'options' => [
                    'max',
                    'min'
                ]
            ]
        ];
    }

查询

您必须使用Filter()函数来检索数据,请记住您必须在查询的最后调用它,不要调用paginate,因为它会自动分页

    $posts= Post::filter();

    // or

    $posts=  Post::where('name','alie')->filter();

最后,在视图中调用filter nav函数。

{{ $posts->filterLinks() }}

Screenshot from 2024-06-10 13-01-00

您可以使用不同的视图,如nav-filter,以线性视图显示所有筛选选项

 {{ $posts->filterLinks('laravelRecordsFilter::nav-filter') }}

Screenshot from 2024-06-10 13-46-03

您还可以通过以下函数在侧边栏视图中显示筛选选项

对于侧边栏

  {{ $posts->filterLinks('laravelRecordsFilter::sidebar-filter') }}

对于导航

   {{ $posts->filterNav() }}

Screenshot from 2024-06-10 13-55-58

当然,视图不一定总是与您的风格匹配,因此您可以将视图发布并按需编辑它

php artisan vendor:publish --tag=laravel-Records-Filter

许可证

MIT许可证(MIT)。有关更多信息,请参阅许可证文件