本文目录导读:

在 Laravel 中,数组查询(Array Query)本身不直接支持管道操作,不过你有几个替代方案可以实现类似管道的功能:
使用查询构建器(支持链式操作)
$users = DB::table('users')
->where('age', '>', 18)
->where('status', 'active')
->orderBy('created_at', 'desc')
->get();
使用管道(Pipeline)模式
Laravel 框架本身提供了 Pipeline 支持:
use Illuminate\Pipeline\Pipeline;
$pipeline = app(Pipeline::class)
->send($query)
->through([
FilterAge::class,
FilterStatus::class,
SortByDate::class,
])
->thenReturn();
$result = $pipeline->get();
自定义管道查询实现
class QueryPipeline
{
protected $builder;
protected $pipes = [];
public function __construct($builder)
{
$this->builder = $builder;
}
public function pipe(callable $pipe)
{
$this->pipes[] = $pipe;
return $this;
}
public function execute()
{
return array_reduce(
$this->pipes,
function($carry, $pipe) {
return $pipe($carry);
},
$this->builder
);
}
}
// 使用示例
$query = new QueryPipeline(User::query());
$users = $query
->pipe(fn($q) => $q->where('age', '>', 18))
->pipe(fn($q) => $q->where('status', 'active'))
->pipe(fn($q) => $q->orderBy('created_at', 'desc'))
->execute()
->get();
利用 Eloquent 的范围查询(类似管道)
class User extends Model
{
public function scopeActive($query)
{
return $query->where('status', 'active');
}
public function scopeAdult($query)
{
return $query->where('age', '>', 18);
}
}
// 使用
$users = User::active()->adult()->orderByDesc('created_at')->get();
使用集合管道(Post-Query)
$users = User::all()
->pipe(fn($collection) => $collection->where('age', '>', 18))
->pipe(fn($collection) => $collection->where('status', 'active'))
->pipe(fn$collection) => $collection->sortByDesc('created_at'));
建议
- 如果需要在数据库层面过滤,推荐使用查询构建器链式调用
- 如果需要复杂的装饰模式,可以使用 Laravel 的 Pipeline
- 如果是处理已有数据集合,使用集合的 pipe 方法
数组查询(如 DB::table('users')->where(['age' => 18]))不支持链式管道,但你可以通过以上方式实现类似的功能。