修复SelectPage筛选问题

pull/526/head
Karson 2026-05-22 11:06:40 +08:00
parent 214ff67a55
commit 9fe1c1c7a6
2 changed files with 36 additions and 22 deletions

View File

@ -468,9 +468,9 @@ class Backend extends Controller
$selectPage = new SelectPage($this->model, $this->selectpageFields);
// 数据限制
$adminIds = $this->getDataLimitAdminIds();
if (is_array($adminIds)) {
$selectPage->setDataLimit($this->dataLimit, $this->dataLimitField, $adminIds);
$dataLimitIds = $this->getDataLimitAdminIds();
if (is_array($dataLimitIds)) {
$selectPage->setDataLimit($this->dataLimit, $this->dataLimitField, $dataLimitIds);
}
try {

View File

@ -76,22 +76,39 @@ class SelectPage
$this->orderFields = $this->allowedFields;
}
/**
* 数据限制的ID集合
* @var array
*/
protected $dataLimitIds = [];
/**
* 设置数据限制
* @param bool|string $dataLimit auth/personal/false
* @param string $field 限制字段
* @param array $adminIds 允许的管理员ID列表
* @param bool|string $dataLimit auth/personal/false
* @param string $dataLimitField 限制字段
* @param array $dataLimitIds 允许的ID列表
* @return $this
*/
public function setDataLimit($dataLimit, $field = 'admin_id', array $adminIds = [])
public function setDataLimit($dataLimit, $dataLimitField = 'admin_id', array $dataLimitIds = [])
{
$this->dataLimit = $dataLimit;
$this->dataLimitField = $field;
$this->dataLimitField = $dataLimitField;
$this->dataLimitIds = $dataLimitIds;
if (is_array($adminIds) && !empty($adminIds)) {
$this->model->where($this->dataLimitField, 'in', $adminIds);
return $this;
}
/**
* 应用数据限制条件(每次构建新查询链前调用)
* ThinkPHP count()/select() 执行后会清空 model options
* 所以需要在每次查询前重新注入 dataLimit 条件。
* @return $this
*/
protected function applyDataLimit()
{
if ($this->dataLimit) {
$this->model->where($this->dataLimitField, 'in', $this->dataLimitIds);
}
return $this;
}
@ -122,14 +139,8 @@ class SelectPage
}
// 验证字段
$showFields = $this->normalizeField($showField);
$keyFields = $keyField ? $this->normalizeField($keyField) : [];
foreach ($showFields as $f) {
$this->validateField($f);
}
foreach ($keyFields as $f) {
$this->validateField($f);
}
$this->validateField($showField);
$this->validateField($keyField);
// 验证搜索字段
foreach ($searchField as $f) {
@ -154,7 +165,9 @@ class SelectPage
);
// 执行总数统计
$total = $this->model->where($where)->count();
$total = $this->applyDataLimit()
->model->where($where)
->count();
if ($total <= 0) {
return ['list' => [], 'total' => 0];
@ -167,8 +180,9 @@ class SelectPage
$this->model->order($order);
}
// 执行查询
$dataList = $this->model->where($where)
// 执行查询count()会清空options需重新应用dataLimit
$dataList = $this->applyDataLimit()
->model->where($where)
->page($page, $pageSize)
->select();