当前位置: 首页 > 后端技术 > PHP

inlaravelinmulti-columnspecialquerytype解决方法

时间:2023-03-29 16:36:54 PHP

SQLquery有一个inmulti-columnspecialquerytype,大概是这样select*fromorderwhere(id,buyer)in((1,'张三'),(2、'Lisi'))和order.deleted_at为空。Laravel的查询构建器不直接支持这种类型的查询。我通过查询生成器Macroable添加了一个whereIns查询方法,以促进此类查询。使用示例whereRaw("(id,buyer)in((1,'张三'),(2,'李四'))")->whereIns(['id','buyer'],[['buyer'=>'张三','id'=>1],[2,'李四']])->dump()->get();//"select*from`order`where(id,buyer)in((?,?),(?,?))and`order`.`deleted_at`isnull"//数组:4[//0=>1//1=>"张三"//2=>2//3=>"李四"//]新建QueryBuilderMacrotoArray();$values=array_map(function($value)use($columns){if(array_is_list($value)){return$value;}returnarray_reduce($columns,function($sortedValue,$column)use($value){$sortedValue[$column]=$value[$column]??trigger_error(sprintf('%s:%s','在数组中找不到该列的值。',$column),E_USER_ERROR);return$sortedValue;},[]);},$values);$rawValue=sprintf('(%s)',内爆(',',array_fill(0,count($columns),'?')));$rawValues=implode(',',array_fill(0,count($values),$rawValue));$raw="($rawColumns)$type($rawValues)";返回$this->whereRaw($raw,$values,$boolean);};}publicfunctionwhereNotIns():callable{returnfunction(array$columns,$values){/**@var\Illuminate\Database\Eloquent\Builder$this*/return$this->whereIns($columns,$values,'和',真实);};}publicfunctionorWhereIns():callable{returnfunction(array$columns,$values){/**@var\Illuminate\Database\Eloquent\Builder$this*/return$this->whereIns($columns,$values,'或者');};}publicfunctionorWhereNotIns():callable{returnfunction(array$columns,$values){/**@var\Illuminate\Database\Eloquent\Builder$this*/return$this->whereIns($columns,$values,'或',真);};}}AppServiceProvider注册QueryBuilderMacro即可app->make(QueryBuilderMacro::class));EloquentBuilder::mixin($queryBuilderMacro);关系::mixin($queryBuilderMacro);}...}原文链接https://github.com/guanguans/guanguans.github.io/issues/46

最新推荐
猜你喜欢