在laravel中使用Pipeline优雅的处理多条件查询示例
Laravel  /  管理员 发布于 5个月前   333
环境:Laravel 10+ 中的使用管道Pipeline用法简化Laravel 项目中的查询。
ps:
为了学习代码,我写个控制器,一个 trait,两个通用过滤器类,一个模型类,
想图省事都放 models 目录下
示例代码:
写个 trait 增强模型类,路径自由
<?php
namespace App\Models;
use Illuminate\Pipeline\Pipeline;
// 对模型类增强,但是同样可以做成父类供子类调用,效果一样。
trait Filterable
{
// 基本方法,但可以不管他。
public function scopeFilter($query, array $through)
{
return app(Pipeline::class)
->send($query)
->through($through)
->thenReturn();
}
// 适用于 表字段和请求参数名相同,且查询等值的情况。
public function scopeStringFilter($query, array $through)
{
$newArr = [];
foreach ($through as $value) {
$newArr[] = '\App\Models\StringFilter:' . $value;
}
return app(Pipeline::class)
->send($query)
->through($newArr)
->thenReturn();
}
// 适用于 表字段和请求参数名相同,且查询like的情况。
public function scopeStringLikeFilter($query, array $through)
{
$newArr = [];
foreach ($through as $value) {
$newArr[] = '\App\Models\StringLikeFilter:' . $value;
}
return app(Pipeline::class)
->send($query)
->through($newArr)
->thenReturn();
}
}
通用过滤器
<?php
namespace App\Models;
class StringFilter
{
public function handle($query, $next,$column)
{
if ( $v = request()->input( $column )) {
$query->where($column, $v);
}
return $next($query);
}
}
<?php
namespace App\Models;
class StringLikeFilter
{
public function handle($query, $next,$column)
{
if ( $v = request()->input( $column )) {
$query->where($column, 'like', '%'. $v. '%');
}
return $next($query);
}
}
模型类
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
class Order extends Model
{
use Filterable;
protected $table = 'order';
protected $primaryKey = 'id';
public $timestamps = false;
protected $guarded = [];
}
控制器
class TestController extends Controller
{
public function index(Request $request)
{
return Order::query()->stringFilter([
'type',
'category',
])->stringLikeFilter([
'name',
])->get();
// 等价写法。
//if ($request->input('type')){
// $query->where('type', $request->input('type'));
//}
//if ($request->input('category')){
// $query->where('category', $request->input('category'));
//}
//if ($request->input('name')){
// $query->where('name','like', '%'.$request->input('name').'%');
//}
}
}
以上代码就是 , 请求中如果有 type 和 category 的参数
就 where type = 请求 type and category= 请求 category
如果请求中有 name 参数。
就 where name like ‘% name%’
123 在
Clash for Windows作者删库跑路了,github已404中评论 按理说只要你在国内,所有的流量进出都在监控范围内,不管你怎么隐藏也没用,想搞你分..原梓番博客 在
在Laravel框架中使用模型Model分表最简单的方法中评论 好久好久都没看友情链接申请了,今天刚看,已经添加。..博主 在
佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 @1111老铁这个不行了,可以看看近期评论的其他文章..1111 在
佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 网站不能打开,博主百忙中能否发个APP下载链接,佛跳墙或极光..路人 在
php中使用hyperf框架调用讯飞星火大模型实现国内版chatgpt功能示例中评论 教程很详细,如果加个前端chatgpt对话页面就完美了..Copyright·© 2019 侯体宗版权所有· 粤ICP备20027696号