如何在遵循请求模式的控制器中使用带自定义约束的方法查询数据?
在遵循请求模式的控制器中实现带自定义列约束的数据获取方法
在Laravel遵循请求模式的控制器里,要实现带自定义列约束的数据获取,核心是把约束逻辑和请求层结合,既符合职责划分,又方便复用,以下是几种实用方案:
方案1:在请求类中添加自定义查询约束方法
直接在请求类里封装约束逻辑,让控制器调用这个方法来构建查询:
class IndexRequest extends FormRequest { public function authorize() { return true; } public function rules() { return []; } // 自定义查询约束方法,接收查询构造器并返回带约束的实例 public function applyQueryConstraints($query) { // 示例:根据请求参数添加动态约束 if ($this->has('status')) { $query->where('status', $this->input('status')); } // 固定列约束,比如只取未删除的数据 $query->where('is_deleted', false); return $query; } }
控制器中调用:
class SampleController extends Controller { protected $model = SampleModel::class; protected $indexRequest = IndexRequest::class; public function index() { $request = app($this->indexRequest); $request->validate(); // 先执行请求验证 $query = $this->model::query(); // 调用请求类的约束方法获取数据 $data = $request->applyQueryConstraints($query)->get(); return response()->json($data); } }
方案2:通过请求类属性传递约束
如果约束基于验证后的参数,可以在请求类里定义属性,验证完成后赋值,再让控制器读取:
class IndexRequest extends FormRequest { public $queryConstraints = []; public function authorize() { return true; } public function rules() { return [ 'status' => 'nullable|in:active,inactive', ]; } // 验证通过后构建约束数组 public function withValidator($validator) { if ($this->has('status')) { $this->queryConstraints['status'] = $this->input('status'); } // 追加固定约束 $this->queryConstraints['is_deleted'] = false; } }
控制器中使用:
class SampleController extends Controller { protected $model = SampleModel::class; protected $indexRequest = IndexRequest::class; public function index(IndexRequest $request) { $query = $this->model::query(); // 遍历约束数组添加查询条件 foreach ($request->queryConstraints as $column => $value) { $query->where($column, $value); } $data = $query->get(); return response()->json($data); } }
方案3:结合模型查询作用域(高复用场景)
如果约束逻辑需要在多个地方复用,先在模型里定义查询作用域,再在请求类里调用:
首先在模型中添加作用域:
class SampleModel extends Model { // 根据状态筛选的作用域 public function scopeWithStatus($query, $status) { return $query->where('status', $status); } // 筛选未删除数据的作用域 public function scopeNotDeleted($query) { return $query->where('is_deleted', false); } }
然后在请求类的约束方法里调用这些作用域:
class IndexRequest extends FormRequest { public function authorize() { return true; } public function rules() { return []; } public function applyQueryConstraints($query) { if ($this->has('status')) { $query->withStatus($this->input('status')); } $query->notDeleted(); return $query; } }
控制器的用法和方案1一致。
内容的提问来源于stack exchange,提问作者Kevin Otieno
相关产品推荐
相关产品推荐

