欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Laravl 子句

程序员文章站 2022-03-24 19:15:22
...

Where子句

简单 Where 子句

使用查询构建器上的 where 方法可以添加 where 子句到查询中,调用where 最基本的方式需要传递三个参数,第一个参数是列名,第二个参数是任意一个数据库系统支持的操作符,第三个参数是该列要比较的值。

		//以下两行代码 效果一样
        $users = User::where('id','=',  9)->get()->toArray();
        $users = User::where('id', 9)->get()->toArray();

为了方便,如果你只是简单比较列值和给定数值是否相等,可以将数值直接作为where 方法的第二个参数
我们还可以传递一个条件数组给where

    $users = User::where([
            ['id','>',8],
            ['price', '>',200]
        ])
            ->get()
            ->toArray();

SQl :

select * from `bl_user` where (`id` > '8' and `price` > '200')

or 语句

你可以通过方法链将多个 where 约束链接到一起,也可以添加 or 子句到查询,orWhere 方法和 where 方法接收参数一样:

        $users = User::where('id' ,'>',10)
            ->orWhere('price', '>' ,100)
            ->get()
            ->toArray();

其他的where查询参见文档 :https://laravelacademy.org/post/8060.html#toc_3


参数分组

有时候你需要创建更加高级的where子句,比如“where exists”或者嵌套的参数分组。Laravel 查询构建器也可以处理这些。作为开始,让我们看一个在括号中进行分组约束的例子:

        $users = User::where('id', '>', 10)
            ->orwhere(function ($query) {
                $query->where('price', '>', '50')
                    ->where('name', 'Marun');
            })
            ->get()
            ->toArray();

正如你所看到的,传递闭包到 orWhere 方法构造查询构建器来开始一个约束分组,该闭包将会获取一个用于设置括号中包含的约束的查询构建器实例。上述语句等价于下面的 SQL:

select * from `bl_user` where `id` > '10' or (`price` > '50' and `name` = 'Marun')

where exists子句
whereExists 方法允许你编写 where exists SQL 子句,whereExists 方法接收一个闭包参数,该闭包获取一个查询构建器实例从而允许你定义放置在“exists”子句中的查询:

   $users = User::whereExists(function ($query){
                $query->selectRaw(1)->from('book')->whereRaw('bl_book.id > 5');
        })->get()->toArray();

上述查询等价于下面的 SQL 语句:

select * from `bl_user` where exists (select 1 from `bl_book` where bl_book.id > 5)

JSON Where子句

Laravel 还支持在提供 JSON 字段类型的数据库(目前是 MySQL 5.7 和 PostgresSQL)上使用操作符 -> 获取指定 JSON 字段值:

$users = DB::table('users')
                ->where('options->language', 'en')
                ->get();

$users = DB::table('users')
                ->where('preferences->dining->meal', 'salad')
                ->get();

排序、分组、限定

orderBy

orderBy 方法允许你通过给定字段对结果集进行排序,orderBy 的第一个参数应该是你希望排序的字段,第二个参数控制着排序的方向 ——ascdesc

$users = DB::table('users')
        ->orderBy('name', 'desc')
        ->get();

latest / oldest

latestoldest 方法允许你通过日期对结果进行排序,默认情况下,结果集根据 created_at 字段进行排序,或者,你可以按照你想要排序的字段作为字段名传入:

$user = DB::table('users')
        ->latest()
        ->first();

inRandomOrder

inRandomOrder 方法可用于对查询结果集进行随机排序,比如,你可以用该方法获取一个随机用户:

$randomUser = DB::table('users')
        ->inRandomOrder()
        ->first();

groupBy / having

groupByhaving 方法用于对结果集进行分组,having 方法和 where 方法的用法类似:

$users = DB::table('users')
        ->groupBy('account_id')
        ->having('account_id', '>', 100)
        ->get();

skip / take
想要限定查询返回的结果集的数目,或者在查询中跳过给定数目的结果,可以使用skiptake 方法:
skip = offest
take = limit

$users = DB::table('users')->skip(10)->take(5)->get();

作为替代方法,还可以使用 limit 和 offset 方法:

$users = DB::table('users')
        ->offset(10)
        ->limit(5)
        ->get();

条件子句

有时候你可能想要某些条件为true 的时候才将条件子句应用到查询。例如,你可能只想给定值在请求中存在的情况下才应用 where 语句,这可以通过when 方法实现:

		$id = $request->input('id');
        $users  = User::when($id,function ($query) use ($id){
            return $query->where('id',$id);
        })->get()->toArray();

when 方法只有在第一个参数为 true 的时候才执行给定闭包,如果第一个参数为 false,则闭包不执行。

你可以传递另一个闭包作为 when 方法的第三个参数,该闭包会在第一个参数为 false 的情况下执行。为了演示这个特性如何使用,我们来配置一个查询的默认排序:

		$sortBy = null;
        $users = User::when($sortBy, function ($query) use ($sortBy) {
                return $query->orderBy($sortBy);
            }, function ($query) {
                return $query->orderBy('name');
            })
            ->get()
            ->toArray();
相关标签: Laravel