请问下 Laravel 的 ORM 查询条件能不能像 TP 那样传递数组作为条件呢

我看了文档,文档里面就讲了几个例子,一些比较复杂的查询压根就没讲到。
我现在有个需求就是在model里面,会根据传过来的条件来组装不同的查询条件,但是看文档的那种写法貌似不太行。

我自己查资料也看到有如下的格式的查询方式

$goodsShow = Goods::where('cate_id','=',$cate_id)
    ->where(function($query){
        $query->where('status','<','61')
            ->orWhere(function($query){
                $query->where('status', '91');
            });
    })->first();

这种查询用的很不习惯~

《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
讨论数量: 9
leo

file

7年前 评论

就像 Leo 写的一样,首先创建一个 QueryBuilder

$query = Goods::query();              // 返回的是一个 QueryBuilder 实例

这个时候其实可以用各种判断了,比如:

if ($request->admin) {
    $query = $query ->where( 'cate_id' , $cate_id);
} else {
    $query = $query ->where( 'cate_id' , $user->id);
}

因为 QueryBuilder 查询条件返回的都是自己 (return $this),所以你可以根据不同的条件组合下去。

最后调用 get 方法解析结果。

$query ->get()

比如这是我在tinker里面写的一个小例子:

>>> $q = User::query()
=> Illuminate\Database\Eloquent\Builder {#1102}
>>> $q ->where('id',1)
=> Illuminate\Database\Eloquent\Builder {#1102}
>>> $q->has('profile')
=> Illuminate\Database\Eloquent\Builder {#1102}
>>> $q->get()
=> Illuminate\Database\Eloquent\Collection {#1099
     all: [
       Modules\User\Entities\User {#1094
         id: 1,
         name: "Ollie Cole",
         email: "guillermo.hoppe@example.net",
         created_at: "2016-10-27 15:48:12",
         updated_at: "2016-10-27 15:48:12",
       },
     ],
   }

QueryBuilder 里面还有很多类似于原生 sql 的方法,包括 join 什么的,比如你可以写:

$query->select('id')->from('users')->where('name', 'like', 'Jim')->orderBy('created_at')->get()

应该是可以组合成很复杂的查询,而且条理也很清晰。

7年前 评论

@leo 多谢,我试试去

7年前 评论

昨天在处理其他问题,今天我这么试了下是好使的

if($params['type'] == 'assign'){
                $select = self::where('assign_man_mid',$params['member_id']);

            }elseif($params['type'] == 'join'){
                $select = self::where('member_list.member_id',$params['member_id']);
            }

            // status,-'notstarted','ongoing','closed','completed','delayed'
            if(isset($params['status']) and $params['status']){
                $time = time();
                switch ($params['status']) {
                    case 'closed':
                        $select = $select->where('status','closed');
                        break;

                    case 'completed':
                        $select = $select->where('status','completed');
                        break;

                    case 'delayed':
                        $select = $select->where('progress.end_time','<',$time);
                        break;

                    case 'notstarted':
                        $select = $select->where('progress.start_time','>',$time);
                        break;

                    case 'ongoing':
                        $select = $select->where('progress.start_time','<',$time)
                            ->where('progress.end_time','>',$time);
                        break;
                }
            }
7年前 评论

@oustn 这个看着很清晰,我试试去

7年前 评论

@oustn

直接使用ORM

$users = User::where('name', '!=', 'admin')->paginate();

返回的对象是

LengthAwarePaginator {#325 ▼
  #total: 2
  #lastPage: 1
  #items: Collection {#327 ▶}
  #perPage: 15
  #currentPage: 1
  #path: "http://weicard.example.com/admin/user"
  #query: []
  #fragment: null
  #pageName: "page"
}

用query拼接查询出来

$query = User::query();
        $query->where('name', '!=', 'admin');
        $query->get();

返回的对象是

Builder {#322 ▼
  #query: Builder {#321 ▶}
  #model: User {#323 ▶}
  #eagerLoad: []
  #macros: []
  #onDelete: null
  #passthru: array:11 [▶]
  #scopes: []
  #removedScopes: []
}

找不到items: Collection ,不知道怎么使用查询后的数据,求指导

7年前 评论

@BoomThanks 要用结果保存 $users = $query->get(),这个方法会 return 一个结果,而 $query 依然是 Builder

7年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!