Laravel数组查询支持管道吗

wen PHP项目 2

本文目录导读:

Laravel数组查询支持管道吗

  1. 使用查询构建器(支持链式操作)
  2. 使用管道(Pipeline)模式
  3. 自定义管道查询实现
  4. 利用 Eloquent 的范围查询(类似管道)
  5. 使用集合管道(Post-Query)
  6. 建议

在 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]))不支持链式管道,但你可以通过以上方式实现类似的功能。

抱歉,评论功能暂时关闭!