在laravel中使用Pipeline優(yōu)雅的處理多條件查詢示例
Laravel  /  管理員 發(fā)布于 9個(gè)月前   490
環(huán)境:Laravel 10+ 中的使用管道Pipeline用法簡(jiǎn)化Laravel 項(xiàng)目中的查詢。
ps:
為了學(xué)習(xí)代碼,我寫個(gè)控制器,一個(gè) trait,兩個(gè)通用過(guò)濾器類,一個(gè)模型類,
想圖省事都放 models 目錄下
示例代碼:
寫個(gè) trait 增強(qiáng)模型類,路徑自由
<?php
namespace App\Models;
use Illuminate\Pipeline\Pipeline;
// 對(duì)模型類增強(qiáng),但是同樣可以做成父類供子類調(diào)用,效果一樣。
trait Filterable
{
// 基本方法,但可以不管他。
public function scopeFilter($query, array $through)
{
return app(Pipeline::class)
->send($query)
->through($through)
->thenReturn();
}
// 適用于 表字段和請(qǐng)求參數(shù)名相同,且查詢等值的情況。
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();
}
// 適用于 表字段和請(qǐng)求參數(shù)名相同,且查詢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();
}
}
通用過(guò)濾器
<?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();
// 等價(jià)寫法。
//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').'%');
//}
}
}
以上代碼就是 , 請(qǐng)求中如果有 type 和 category 的參數(shù)
就 where type = 請(qǐng)求 type and category= 請(qǐng)求 category
如果請(qǐng)求中有 name 參數(shù)。
就 where name like ‘% name%’
123 在
Clash for Windows作者刪庫(kù)跑路了,github已404中評(píng)論 按理說(shuō)只要你在國(guó)內(nèi),所有的流量進(jìn)出都在監(jiān)控范圍內(nèi),不管你怎么隱藏也沒(méi)用,想搞你分..原梓番博客 在
在Laravel框架中使用模型Model分表最簡(jiǎn)單的方法中評(píng)論 好久好久都沒(méi)看友情鏈接申請(qǐng)了,今天剛看,已經(jīng)添加。..博主 在
佛跳墻vpn軟件不會(huì)用?上不了網(wǎng)?佛跳墻vpn常見(jiàn)問(wèn)題以及解決辦法中評(píng)論 @1111老鐵這個(gè)不行了,可以看看近期評(píng)論的其他文章..1111 在
佛跳墻vpn軟件不會(huì)用?上不了網(wǎng)?佛跳墻vpn常見(jiàn)問(wèn)題以及解決辦法中評(píng)論 網(wǎng)站不能打開(kāi),博主百忙中能否發(fā)個(gè)APP下載鏈接,佛跳墻或極光..路人 在
php中使用hyperf框架調(diào)用訊飛星火大模型實(shí)現(xiàn)國(guó)內(nèi)版chatgpt功能示例中評(píng)論 教程很詳細(xì),如果加個(gè)前端chatgpt對(duì)話頁(yè)面就完美了..
Copyright·? 2019 侯體宗版權(quán)所有·
粵ICP備20027696號(hào)