本文目录导读:

在 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]))不支持链式管道,但你可以通过以上方式实现类似的功能。
版权声明:NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播