plokko

querable-resource

此包的最新版本(0.2.1)没有提供许可证信息。

Laravel的Ajax-querable资源

0.2.1 2022-12-06 20:40 UTC

This package is auto-updated.

Last update: 2024-09-07 00:32:37 UTC


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";