michaelnabil230/laravel-query-conditions

这是我制作的laravel-query-conditions包

v1.0.0 2022-07-07 17:17 UTC

README

Latest Version on Packagist GitHub Tests Action Status GitHub Code Style Action Status Total Downloads

这里应该放置你的描述。请限制在一段或两段内。考虑添加一个小示例。

安装

您可以通过composer安装此包

composer require michaelnabil230/laravel-query-conditions

准备您的模型

要将查询条件与模型关联,模型必须实现以下接口和特质

use Illuminate\Database\Eloquent\Model;
use MichaelNabil230\QueryConditions\Support\Condition;
use MichaelNabil230\QueryConditions\Concerns\HasQueryCondonation;
use MichaelNabil230\QueryConditions\Interfaces\QueryCondonation as InterfacesQueryCondonation;
use Illuminate\Database\Eloquent\Builder;

class YourModel extends Model implements InterfacesQueryCondonation
{
    use HasQueryCondonation;

    public function parseQBRule(Builder $query, Condition $condition, string $method): void
    {
        if ($condition->rule === 'age') {
            $query->{$method}('age', $condition->operator, $condition->value);
        }

        if ($condition->rule === 'created_at') {
            $query->{$method}('created_at', $condition->operator, $condition->value);
        }
    }
}

准备Vue

import './bootstrap';

window.Vue = require('vue').default;

import QueryBuilder from './components/QueryBuilder.vue'

const app = new Vue({
    el: '#app',
    components: { QueryBuilder },
    methods: {
        getResults: function () {
            axios.post('/results', { query: this.query }).then(response => {
                this.results = response.data;
                console.log({ response });
            });
        }
    },
    data() {
        return {
            query: {},
            rules: [
                {
                    type: "numeric",
                    id: "age",
                    label: "Age"
                },
                {
                    type: "select",
                    id: "job_title",
                    label: "Job Title",
                    choices: [
                        { label: 'Regional Manager', value: 'Regional Manager' },
                        { label: 'Assistant to the Regional Manager', value: 'Assistant to the Regional Manager' },
                        { label: 'Sales Associate', value: 'Sales Associate' },
                    ]
                },
                {
                    type: "numeric",
                    id: "has_orders",
                    label: "has Orders",
                    operators: ['=', '>=']
                },
            ],
        };
    }
});

首先在blade或vue中调用指令(并传递条件)

现在

    <div id="app">
        <query-builder :rules="rules" v-model="query" :clickable="getResults"></query-builder>
    </div>

下一个版本

    $condonations = [
        Text::make('Name'),
        Number::make('Age')->min(1)->max(1000),
        Select::make('Job title', 'job_title')->options([
            'R' => 'Regional Manager',
            'A' => 'Assistant to the Regional Manager',
            'S' => 'Sales Associate',
        ])
    ];
    <div id="app">
        <query-builder :condonations="condonations" v-model="query" :clickable="getResults"></query-builder>
    </div>

    <script>
        let condonations = @json($condonations)
    </script>

最终前往控制器

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use MichaelNabil230\QueryConditions\QueryConditions;
use App\Models\User;

class ConditionController extends Controller
{
    public function getDataFromQueryConditions(Request $request)
    {
        $users = QueryConditions::for(User::class, $request->input('query'))
            ->get();

        return [
            'users' => $users,
        ];
    }
}

一些包的截图,这是一个最好的包

待办事项

  • 格式化文档
  • 在条件中添加分组
  • 测试复杂查询
  • 在前端实现Fields
  • 添加单元测试

测试

composer test

支持

变更日志

请参阅CHANGELOG以获取有关最近更改的更多信息。

贡献

请参阅CONTRIBUTING以获取详细信息。

安全漏洞

请查看我们的安全策略以了解如何报告安全漏洞。

鸣谢

许可协议

MIT许可(MIT)。请参阅许可文件以获取更多信息。