plokko/
querable-resource
Laravel的Ajax-querable资源
Requires
- php: >=7.0.0
- illuminate/support: ^5.4.0|^6.0|^7.0|^8.0|^9.0
README
Laravel类,帮助从Ajax查询(分页和筛选)并返回Eloquent资源。
支持Laravel 5.5资源。
安装
通过composer安装 composer require plokko/querable-resource
快速开始
首先,您需要扩展Plokko\QuerableResource\QuerableResource
类,实现getQuery方法,该方法返回基本查询
class TestQuerableResource extends \Plokko\QuerableResource\QuerableResource { protected function getQuery(): Illuminate\Database\Eloquent\Builder { return App\User::where('id','>',1); // Just a simple query to demonstrate functionality } }
接下来,我们将实例化它并将其返回到请求中
Route::get('/test',function(){ $qr = new TestQuerableResource(); return $qr; });
页面应该返回包含所有结果的基本资源
分页
要启用分页,请编辑受保护的属性$paginate或通过pagination()方法将其设置为所需的页面大小或设置为null以禁用它。
class TestQuerableResource extends \Plokko\QuerableResource\QuerableResource { protected $paginate = 30,//30 items per page /** * Allowed client-defined paginations, * if null no client pagination is allowed * if int set the maxium page size allowed * if array only the page sizes listed in the array are allowed * @var int|array|null */ $paginations = 100; protected function getQuery(): Illuminate\Database\Eloquent\Builder { return App\User::where('id','>',1); // Just a simple query to demonstrate functionality } }
$paginations属性指定用户可选的有效值,如果值为null
,则仅丢弃$paginate用户值以使用$paginate,如果指定了整数值,则将其设置为最大值(在这种情况下,用户可以选中最多100页的分页,默认为每页30项);如果指定了整数数组,则用户值必须包含在数组中,否则使用$paginate值(例如[10,20,30,50]
)
Route::get('/test',function(){ $qr = new TestQuerableResource(); $qr->paginate(10); // Set pagination to 10 items per page return $qr; });
筛选结果
要筛选结果,扩展受保护的属性$filteredFields,指定您要筛选的字段
class TestQuerableResource extends \Plokko\QuerableResource\QuerableResource { protected $filteredFields = ['name','email']; // enable filtering for name and email columns protected function getQuery(): Illuminate\Database\Eloquent\Builder { return App\User::where('id','>',1); // Just a simple query to demonstrate functionality } }
您不需要向资源传递任何内容,筛选是自动和透明的。
Route::get('/test',function(){ $qr = new TestQuerableResource(); return $qr; });
默认情况下,比较使用LIKE 'value%';例如,页面/test?name=a
将搜索所有以'a'开头的用户。
别名
如果您想使用与字段不同的查询参数,可以指定别名作为字段的键
class TestQuerableResource extends \Plokko\QuerableResource\QuerableResource { protected $filteredFields = [ 'n' => 'name', // query parameter n to field name 'mail' => 'email', // query parameter mail to field email ]; //.... }
高级筛选选项
您可以使用筛选选项的数组代替字段名称,例如
- field - 字符串(必需)- 相应的字段名称,必需
- type - 字符串 - 比较类型(例如'=','like','>','>=',...)
class TestQuerableResource extends \Plokko\QuerableResource\QuerableResource { protected $filteredFields = [ 'n' => [ //an can be used 'field'=>'name', 'type'=>'like', ], [ 'field'=>'email', // If no alias is specified field will be used as query parameter //comparaison type is optional ] ]; //.... }
更改查询字段名称
如果您想将所有筛选字段分组在一个输入组中,例如filter[field_name],则需要编辑受保护的属性$filterQueryParameter
class TestQuerableResource extends \Plokko\QuerableResource\QuerableResource { protected $filteredFields = ['name','email'], // enable filtering for name and email columns $filterQueryParameter='filter'; protected function getQuery(): Illuminate\Database\Eloquent\Builder { return App\User::where('id','>',1); // Just a simple query to demonstrate functionality } }
最后一个示例的URL现在将是/test?filter[name]=a
定义筛选规则
自定义筛选函数
如果您需要更精细的查询,可以覆盖默认的filter函数并指定您的自定义筛选函数
class TestQuerableResource extends \Plokko\QuerableResource\QuerableResource { // No need to specify $filteredFields, we're using a custom filtering function //Override the default filtering function protected function filter(Builder &$query,array $filterValues){ if(array_key_exists('name',$filterValues)){ $query->where('name','LIKE','%'.$filterValues['name'].'%');//apply your filtering } //.... } protected function getQuery(): Illuminate\Database\Eloquent\Builder { return App\User::where('id','>',1); // Just a simple query to demonstrate functionality } }
不要担心,分页和查询字段名称也将自动应用于您的筛选,无需实现它们!
返回自定义资源
如果您想使用自定义资源筛选结果,可以通过在受保护的字段$useResource中指定您的资源类名称来实现
class TestQuerableResource extends \Plokko\QuerableResource\QuerableResource { protected $useResource = \App\Http\Resources\UserResource::class; protected function getQuery(): Illuminate\Database\Eloquent\Builder { return App\User::where('id','>',1); // Just a simple query to demonstrate functionality } }
该类现在将返回指定的资源(作为集合);有关资源的更多详细信息,请参阅Laravel 5.5 API资源文档。
JavaScript集成
此插件包含一些JavaScript资源,以帮助与PHP对应插件集成。
此插件包括两个主要助手
- ResourceQuery 用于构建对PHP插件对应端的Ajax请求
- 可查询结果 对 ResourceQuery 的包装,返回可查询的结果而不是查询本身,在 Vue.js 应用程序中尤其有用
// Import from the /vendor folder, this path is related to /resources/assets/js/components/ // Import QuerableResult and ResourceQuery (optional) import QuerableResult,{ResourceQuery} from "../../../../vendor/plokko/querable-resource/assets/js/QuerableResult"; // Or just ResourceQuery //import ResourceQuery from "../../../../vendor/plokko/querable-resource/assets/js/ResourceQuery";