aerynl/refinement

为Laravel使用的简单筛选

1.1.0 2019-02-21 17:02 UTC

This package is auto-updated.

Last update: 2024-08-28 20:09:33 UTC


README

简短描述

为Laravel使用的简单筛选。包含在Session中保存筛选器、生成筛选选项和获取筛选结果的功能。

快速入门

composer require aerynl/refinement
php artisan vendor:publish --provider="Aerynl\Refinement\RefinementServiceProvider"

第二个命令将创建\app\config\packages\aerynl\refinement\config.php文件,您可以在其中指定表连接和筛选名称。

如何使用

如果您想在会话中保存筛选器,请运行

$refinements = array(
	'products' => array(
		'color_id' => array(12, 13, 14)
	);
);
Refinement::updateRefinements("products_filters", $refinements);

如果您想获取筛选结果,请运行

$products_query = Refinement::getRefinedQuery("Product", "products_filters");
$products = $products_query->paginate(10);

如果您想获取筛选选项,请运行

$options_scheme = array(
	'parent_table' => 'products', 'join_table' => 'colors', 'filter_column' => 'color_id', 'filter_value' => 'color_name'
);
$products_options = Refinement::getRefinedQuery("Product", $options_scheme, "products_filters");

在配置文件中写入什么

在配置文件中,您可以在joins数组中指定表连接,并在titles数组中指定筛选名称。

表连接

有时我们需要进行连接以创建必要的查询。

由于很难从输入的参数中创建合适的查询,因此以下配置将用于创建连接。请确保您用于筛选的所有表都有连接配置!注意,这并不意味着您应该在连接数组中指定用于获取选项的表。例如,如果您通过product.color_id筛选产品,并且有一个包含所有颜色的colors表,则不需要将colors表添加到连接数组中。但是,如果您始终需要只显示具有product_sale.active = false的产品,请确保在配置文件中指定了product_sale表。

连接数组的方案如下

'joins' => array(
        '$table1_name|$table2_name' => array(
            'left' => '$table1_name.$table1_column',
            'operand' => '=', // or whatever you want
            'right' => '$table2_name.$table2_column'
        ), 
		...
     );

筛选器标题

在此处配置您的筛选器名称。如果没有输入名称,则将使用标准命名格式(ucfirst

示例

'titles' => array(
    'products|color_id' => 'Product color',
	...
);

筛选器标题翻译

/app/lang/en中创建一个名为refinements.php的文件,在那里您可以添加配置中添加的标题的翻译。

关于函数的详细信息

Refinement::updateRefinements($session_name, $new_refinements)

此方法用于在会话中保存筛选器。$session_name是会话名称,因此您可以在一个应用程序中使用多个筛选器会话。$new_refinements是要记住的新筛选器数组。保持以下方案以使包正确工作

$new_refinements = array(
	'$table_name1' => array(
		'$table_column1' => array(
			$value1, $value2, $value3
		),
		'$table_column2' => array(
			$value1, $value2, $value3
		),
		...
	),
	...
);

Refinement::getRefinedQuery($main_model, [$session_name, $eager, $additional_wheres, $additional_joins, $refinements_array])

此方法用于生成获取筛选结果的查询。为什么不返回筛选结果?有时您需要在获取结果之前对查询进行一些操作,例如groupBy、orderBy、paginate等。因此,您可以按以下方式使用此函数

$products_query = Refinement::getRefinedQuery("Product", "products_filters");
$products = $products_query->paginate(10);

传递的变量

  • $main_model - 主模型名称的字符串。
  • $session_name - 会话名称的字符串。
  • $eager - 您想要预加载的表的数组。https://laravel.net.cn/docs/4.2/eloquent#eager-loading
  • $additional_wheres - 需要运行的其他where条件的数组。例如 array("products.active is true", "products.deleted is null")。注意,如果您的条件使用除主表之外的表,则需要指定这些表在$additional_joins(和在配置文件中)。
  • $additional_joins - 在$additional_wheres中使用的其他表的数组。注意,这些表需要在配置文件中配置。
  • $refinements_array - 用于需要从自定义数组而不是会话中获取带有过滤器的查询的情况。其格式应与 updateRefinements 函数中的 $new_refinements 相同。在这种情况下,不会使用会话精炼。

Refinement::generateOptionsArray($main_model, [$options_scheme, $session_name, $eager, $additional_wheres, $additional_joins])

此方法用于使用传入的方案生成精炼选项数组。它返回具有以下方案的选项数组

$options_array = array(
	array(
		'column_name' => string $column_name, // e.g. 'color_id'.
		'parent_table' => string $parent_table // e.g. 'products'.
		'title' => string $category_title	// is taken from Config titles array
		'options' => array(
			$option_id => array(
				'name' => string $option_name,  // e.g. "White"
				'id' => mixed $option_id,		// not integer, but mixed in case you filter by enum field or something else.
				'count' => int $number_of_results,  
				'checked' => bool $is_checked
			),
			...
		)
	), 
	...
	);

$column_name$parent_table$option_id 用于为 updateRefinements 函数创建 $new_refinements 数组。例如,您可以使用 name="$parent_table[$column_name][]"value="$option_id" 显示复选框形式的选项。

传入的变量:注意,如果想要获取实际的 $number_of_results,前 5 个变量应与 getRefinedQuery 函数中的相同。

  • $main_model - 主模型名称的字符串。
  • $session_name - 会话名称的字符串。
  • $eager - 您想要预加载的表的数组。https://laravel.net.cn/docs/4.2/eloquent#eager-loading
  • $additional_wheres - 需要运行的其他where条件的数组。例如 array("products.active is true", "products.deleted is null")。注意,如果您的条件使用除主表之外的表,则需要指定这些表在$additional_joins(和在配置文件中)。
  • $additional_joins - 在$additional_wheres中使用的其他表的数组。注意,这些表需要在配置文件中配置。
  • $options_scheme - 我们想要选择的选项方案的方案,格式如下
$options_scheme = array(
	array(
		'parent_table' => string $parent_table_name, - filtering is based on this table
		'filter_column' => string $parent_table_column - column of $parent_table. filtering is based on this column
		'join_table' => string $join_table_name, - table, which is joined to parent table and contains option names
		'filter_value' => string $join_table_column - column with option names
		'additional_wheres' => array of strings - additional where statements
	), 
	...
);

例如:

$options_scheme = array(
	'parent_table' => 'products', 'join_table' => 'colors', 'filter_column' => 'color_id', 'filter_value' => 'color_name', 'additional_wheres' => array("colors.deleted_at is null")
);

这意味着,结果通过 products.color_id 进行过滤。您可以在 colors.color_name 列中看到颜色名称。

即将进行的工作

  • Laravel 5 支持
  • 在编写此文档时,我有一个很棒的点子!我们可以通过将静态方法改为非静态方法来避免每次传递如此多的参数。