laravel笔记-数据库(查询构建器)

27 篇文章 0 订阅
17 篇文章 0 订阅

laravel笔记-数据库(查询构建器)

写在前面

时间可贵,善用目录↑

学习Laravel的笔记,仅仅是作为laravel文档笔记,目的是强化对文档的理解,质量不高。

查方法还是用API文档的好!


什么是查询构建器

我的理解就是:使用框架内置的方法,通过链式操作,快速的构建SQL语句。
类似于ThinkPHP(我是不是暴露了什么)。

查询构建器使用PDO参数绑定来避免SQL注入攻击,不再需要过滤传递到绑定的字符串。


基本语法

就是通过链式操作一步一步的构建一句SQL。
都是通过DB门面~
不太好单讲,就通过例子来理解:

//table用来获取表名
//get是获取全部记录
$users = DB::table('users')->get();

//返回StdClass对象,可以循环取出
foreach ($users as $user) {
    echo $user->name;
}

//获取查询到的第一条记录
$user = DB::table('users')->where('name', 'John')->first();
//结果可以这样取
echo $user->name;

//获取指定列(email)的值
//注意是查询到的第一条记录的指定列的值
$email = DB::table('users')->where('name', 'John')->value('email');


//获取数据列值列表
//就是只获取固定列
$titles = DB::table('roles')->pluck('title');
//而且也可以指定另一个列作为键
//获取title列作为value,name列作为key
$roles = DB::table('roles')->pluck('title', 'name');

count, max, min, avg和 sum都可以在使用~

$users = DB::table('users')->count();
$price = DB::table('orders')->max('price');

一些常用操作

Select

就是sql文中的Select,用来选择要获取那些列

//指定查询列
$users = DB::table('users')->select('name', 'email as user_email')->get();

//如果已经有一个查询,但是想添加查询列
$query = DB::table('users')->select('name');
//可以使用addSelect
$users = $query->addSelect('age')->get();

distinct

强制返回不重复的列

$users = DB::table('users')->distinct()->get();

原生表达式

在链式操作中添加原生表达式:(个人不建议这么写,乱)

使用DB门面的raw方法。

$users = DB::table('users')
                     ->select(DB::raw('count(*) as user_count, status'))
                     ->where('status', '<>', 1)
                     ->groupBy('status')
                     ->get();

Join

顾名思义

$users = DB::table('users')
            //表名,条件,可以多次join
            ->join('contacts', 'users.id', '=', 'contacts.user_id')
            ->join('orders', 'users.id', '=', 'orders.user_id')
            ->select('users.*', 'contacts.phone', 'orders.price')
            ->get();

//左连接
$users = DB::table('users')
            ->leftJoin('posts', 'users.id', '=', 'posts.user_id')
            ->get();

//交叉连接
//交叉连接在第一张表和被连接表之间生成一个笛卡尔积
$users = DB::table('sizes')
            ->crossJoin('colours')
            ->get();

骚操作

可以指定更多的高级连接子句,传递一个闭包到join方法作为该方法的第二个参数,该闭包将会返回允许你指定join子句约束的JoinClause对象.

DB::table('users')
        ->join('contacts', function ($join) {
            $join->on('users.id', '=', 'contacts.user_id')->orOn(...);
        })
        ->get();

//如果要用where
DB::table('users')
        ->join('contacts', function ($join) {
            $join->on('users.id', '=', 'contacts.user_id')
                 ->where('contacts.user_id', '>', 5);
        })
        ->get();

Union

查询构建器还提供了“联合”两个查询的快捷方式,比如,你可以先创建一个查询,然后使用union方法将其和第二个查询进行联合.
(unionAll同样可用)

$first = DB::table('users')
            ->whereNull('first_name');

$users = DB::table('users')
            ->whereNull('last_name')
            ->union($first)
            ->get();

Where

//的二个参数默认相等
$users = DB::table('users')->where('votes', '=', 100)->get();

$users = DB::table('users')
            ->where('name', 'like', 'T%')
            ->get();

//对于多个条件可以这样
$users = DB::table('users')->where([
    ['status', '=', '1'],
    ['subscribed', '<>', '1'],
])->get();

//or
$users = DB::table('users')
                    ->where('votes', '>', 100)
                    ->orWhere('name', 'John')
                    ->get();

//骚操作
DB::table('users')
        ->where('name', '=', 'John')
        ->orWhere(function ($query) {
            $query->where('votes', '>', 100)
                  ->where('title', '<>', 'Admin');
        })
        ->get();

//exists”子句
DB::table('users')
            ->whereExists(function ($query) {
                $query->select(DB::raw(1))
                      ->from('orders')
                      ->whereRaw('orders.user_id = users.id');
            })
            ->get();


//支持在提供JSON字段类型的数据库(目前是MySQL 5.7和Postgres)上使用操作符->查询
$users = DB::table('users')
                ->where('options->language', 'en')
                ->get();

排序、分组、限定

//排序asc或desc
$users = DB::table('users')
                ->orderBy('name', 'desc')
                ->get();

//随机排序(骚操作)
$randomUser = DB::table('users')
                ->inRandomOrder()
                ->first();

//分组
$users = DB::table('users')
                ->groupBy('account_id')
                ->having('account_id', '>', 100)
                ->get();
$users = DB::table('orders')
                ->select('department', DB::raw('SUM(price) as total_sales'))
                ->groupBy('department')
                ->havingRaw('SUM(price) > 2500')
                ->get();

条件子句(骚操作)

用when来判断某些条件(感觉违反了单一原则)

$role = $request->input('role');

$users = DB::table('users')
                ->when($role, function ($query) use ($role) {
                    return $query->where('role_id', $role);
                })
                ->get();

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

可以传递另一个闭包作为when方法的第三个参数,该闭包会在第一个参数为false的情况下执行。

Insert

DB::table('users')->insert([
    ['email' => 'taylor@example.com', 'votes' => 0],
    ['email' => 'dayle@example.com', 'votes' => 0]
]);

//自增ID
$id = DB::table('users')->insertGetId(
    ['email' => 'john@example.com', 'votes' => 0]
);

Update

DB::table('users')
            ->where('id', 1)
            ->update(['votes' => 1]);

//更新JSON字段
DB::table('users')
            ->where('id', 1)
            ->update(['options->enabled' => true]);

//增加/减少(骚操作)
DB::table('users')->increment('votes');
DB::table('users')->increment('votes', 5);
DB::table('users')->decrement('votes');
DB::table('users')->decrement('votes', 5);

Delete

DB::table('users')->delete();
DB::table('users')->where('votes', '>', 100)->delete();

//如果你希望清除整张表,也就是删除所有列并将自增ID置为0,可以使用truncate方法
//很暴力
DB::table('users')->truncate();
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值