From 5c7b554db5d534de7403f1ec751bf1af3f6fd243 Mon Sep 17 00:00:00 2001 From: pengshiyu <1940607002@qq.com> Date: Mon, 4 Jul 2022 09:44:50 +0800 Subject: [PATCH] fix --- blog/laravel/index.md | 11 +- blog/laravel/model.md | 76 +++++++ blog/laravel/sql-builder-modify.md | 92 +++++++++ blog/laravel/sql-builder.md | 316 +++++++++++++++++++++++++++++ index.html | 33 +-- 5 files changed, 514 insertions(+), 14 deletions(-) create mode 100644 blog/laravel/model.md create mode 100644 blog/laravel/sql-builder-modify.md create mode 100644 blog/laravel/sql-builder.md diff --git a/blog/laravel/index.md b/blog/laravel/index.md index 9337828..bdc6349 100644 --- a/blog/laravel/index.md +++ b/blog/laravel/index.md @@ -5,6 +5,8 @@ - 链接:https://pan.baidu.com/s/1Y_o3RdUEsrj6tHchMwY3Mg - 提取码:f4qz +其他课程:https://www.ycku.com/ + 配置 Makefile 文件 ```bash @@ -24,4 +26,11 @@ dev: [表单伪造和 CSRF 保护](blog/laravel/csrf.md) -[数据库](blog/laravel/database.md) \ No newline at end of file +[数据库](blog/laravel/database.md) + +[构造器的查询](blog/laravel/sql-builder.md) + +[构造器的增删改](blog/laravel/sql-builder-modify.md) + +[模型的定义](blog/laravel/model.md) + diff --git a/blog/laravel/model.md b/blog/laravel/model.md new file mode 100644 index 0000000..658dfb8 --- /dev/null +++ b/blog/laravel/model.md @@ -0,0 +1,76 @@ +## 模型的定义 + +创建了一个User.php模型 + +```bash +php8 artisan make:model User +``` + +```php +insert([ + 'name' => '曹操', +]); +// insert into `user` (`name`) values (?) + +//新增多条记录 +DB::table('user')->insert([ + ['name' => '刘备'], + ['name' => '关羽'], + ['name' => '张飞'] +]); +// insert into `user` (`name`) values (?), (?), (?) + +// 忽略重复新增数据的错误 +DB::table('user')->insertOrIgnore([ + 'id' => 1, + 'name' => '李白' +]); +// insert ignore into `user` (`id`, `name`) values (?, ?) + +//获取新增后返回的 ID +$id = DB::table('user')->insertGetId([ + 'name' => '李白' +]); +// insert into `user` (`name`) values (?) + +``` + +## 更新 + +```php +//更新修改一条数据 +DB::table('user')->where('id', 10) + ->update([ + 'name' => '李红', + ]); +// update `user` set `name` = ? where `id` = ? + +//参数 1:修改的条件 +//参数 2:修改的内容(新增的内容) +DB::table('user')->updateOrInsert( + ['id'=>11], + ['name'=>'李黑'] +); +// select exists(select * from `user` where (`id` = ?)) as `exists` +// 不存在 +// insert into `user` (`id`, `name`) values (?, ?) +// 存在 +// update `user` set `name` = ? where (`id` = ?) limit 1 + +//新增时,转换为 json 数据 +DB::table('user')->insert([ + 'name' => json_encode(['age'=>19, 'name'=>'孙权'], JSON_UNESCAPED_UNICODE) +]); + +//修改时,使用 object->id 指定 +DB::table('user')->where('id', 13) +->update([ + 'name->age' => 20 +]); +// update `user` set `name` = json_set(`name`, '$."age"', ?) where `id` = ? + +//默认自增/自减为 1,可设置 +DB::table('user')->where('id', 1)->increment('age'); +// update `user` set `age` = `age` + 1 where `id` = ? + +DB::table('user')->where('id', 2)->decrement('age', 2); +// update `user` set `age` = `age` - 2 where `id` = ? +``` + +## 删除 +```php +// 删除一条数据 +DB::table('user')->delete(1); +// delete from `user` where `user`.`id` = ? + +DB::table('user')->where('id', 2)->delete(); +// delete from `user` where `id` = ? + +// 清空 +DB::table('user')->delete(); +// delete from `user` + +DB::table('user')->truncate(); +// truncate table `user` +``` \ No newline at end of file diff --git a/blog/laravel/sql-builder.md b/blog/laravel/sql-builder.md new file mode 100644 index 0000000..749721f --- /dev/null +++ b/blog/laravel/sql-builder.md @@ -0,0 +1,316 @@ +# 构造器的查询 + +打印执行SQL +```php +DB::listen(function($query) { + $sql = $query->sql; + $bindings = $query->bindings; + Log::info('sql: ' . $sql); + Log::info('params: ' . json_encode($bindings, JSON_UNESCAPED_UNICODE)); +}); +``` + +查询示例 + +```php +//获取全部结果 +DB::table('user')->get(); +// select * from `user` + + //获取第一条数据 +DB::table('user')->first(); +// select * from `user` limit 1 + +//获取第一条数据的 email 字段值 +DB::table('user')->value('name'); +// select `name` from `user` limit 1 + + //通过 id 获取指定一条数据 +DB::table('user')->find(20); +// select * from `user` where `id` = ? limit 1 + +//获取单列值的集合 +DB::table('user')->pluck('name'); +// select `name` from `user` + +//获取单列值的集合(value, key) +DB::table('user')->pluck('name', 'id'); +// select `name`, `id` from `user` +``` + +分块 + +```php +//切割分块执行,每次读取 3 条,id 排序; +DB::table('user')->orderBy('id')->chunk(3, function ($users) { + foreach ($users as $user) { + echo $user->name; + } +}); +// select * from `user` order by `id` asc limit 3 offset 0 +// select * from `user` order by `id` asc limit 3 offset 3 +``` + +聚合查询 + +```php +DB::table('user')->count(); +// select count(*) as aggregate from `user` + +DB::table('user')->max('id'); +// select max(`id`) as aggregate from `user` + +DB::table('user')->min('id'); +// select min(`id`) as aggregate from `user` + +DB::table('user')->avg('id'); +// select avg(`id`) as aggregate from `user` + +DB::table('user')->sum('id'); +// select sum(`id`) as aggregate from `user` +``` + +判断是否存在 +```php +DB::table('user')->where('id', 1)->exists(); +// select exists(select * from `user` where `id` = ?) as `exists` + +DB::table('user')->where('id', 18)->doesntExist(); +// select exists(select * from `user` where `id` = ?) as `exists` +``` + +## 查询表达式 + +1、select 查询 +```php +// 设置显示的列,设置列别名 +DB::table('user')->select('name as username', 'id')->get(); +// select `name` as `username`, `id` from `user` + +// 给已经构建好的查询添加更多字段 +$query = DB::table('user')->select('name as username', 'id'); +$query->addSelect('create_time')->get(); +// select `name` as `username`, `id`, `create_time` from `user` + +// 结合原生 SQL 实现复杂查询 +DB::table('user')->select(DB::raw('COUNT(*) AS count, name')) + ->groupBy('name') + ->get(); +// select COUNT(*) AS count, name from `user` group by `name` + +// 或者直接使用 selectRaw()方法实现原生 +DB::table('user')->selectRaw('COUNT(*) AS count, name') + ->groupBy('name') + ->get(); +// select COUNT(*) AS count, name from `user` group by `name` + +//使用 havingRaw 方法实现分组筛选 +DB::table('user')->selectRaw('COUNT(*) AS count, name') + ->groupBy('name') + ->havingRaw('count>1') + ->get(); +// select COUNT(*) AS count, name from `user` group by `name` having count>1 +``` + +## where 查询 +```php +// where 查询完整形式 +DB::table('user')->where('id', '=', 19)->get(); +// select * from `user` where `id` = ? + +// 可以省略掉=号参数 +DB::table('user')->where('id', 19)->get(); +// select * from `user` where `id` = ? + +DB::table('user')->where('id', '>=', 3)->get(); +// select * from `user` where `id` >= ? + +DB::table('user')->where('name', 'like', '%小%')->get(); +// select * from `user` where `name` like ? + +// 用数组来分别添加条件 +// 查看 SQL 语句用->toSql()替换->get() +DB::table('user')->where([ + 'id' => 90, + 'name' => 'Tom' + ])->get(); +// select * from `user` where (`id` = ? and `name` = ?) + +// 如果条件非等于 +DB::table('user')->where([ + ['id', '>=', 90], + ['name', '=', 'Tom'] ] + )->get(); +// select * from `user` where (`id` >= ? and `name` = ?) +``` + +## where 派生查询 + +```php +// where() + orWhere实现or条件查询 +DB::table('user')->where('id', '>', 5) + ->orWhere('name', 'Tom') + ->get(); +// select * from `user` where `id` > ? or `name` = ? + +//orWhere()结合闭包查询 +$users = DB::table('users') + ->where('price', '>', '95')->orWhere(function ($query) { + $query->where('gender', '女') + ->where('username','like','%小%'); +})->toSql(); +// select * from `users` where `price` > ? or (`gender` = ? and `username` like ?) + +// whereBetween 查询区间价格 60~90 之间 +$users = DB::table('users')->whereBetween('price', [60, 90])->toSql(); +// select * from `users` where `price` between ? and ? +// PS:这里还支持相关三种: +// whereNotBetween/orWhereBetween/orWhereNotBetween; + +// whereIn 查询数组里匹配的数值 +$users = DB::table('users')->whereIn('id', [20,30,50])->toSql(); +// select * from `users` where `id` in (?, ?, ?) +// PS:这里还支持相关三种: +// whereNotIn/orWhereIn/orWhereNotIn; + +//whereNull 查询字段值为 Null 的记录 +$users = DB::table('users')->whereNull('uid')->toSql(); +// select * from `users` where `uid` is null +// PS:这里还支持相关三种: +// whereNotNull/orWhereNull/orWhereNotNull; + + +// whereYear 查询指定日期的记录,或大于 +$users = DB::table('users')->whereDate('create_time', '2018-12-11')->toSql(); +// select * from `users` where date(`create_time`) = ? + +// PS:这里还支持相关四种: +// whereYear/whereMonth/whereDay/whereTime,支持 or 前缀; +// PS:三个参数支持大于小于之类的操作 orWhereDate('create_time','>', '2018-12-11') +``` + +## 排序分组 + +```php +//判断两个相等的字段,同样支持 orWhereColumn() //支持符号'create_time','>', 'update_time' //支持符号支持数组多个字段格式['create_time','>', 'update_time'] +DB::table('user') + ->whereColumn('create_time', 'update_time') + ->get(); +// select * from `user` where `create_time` = `update_time` + +//支持 orderByRaw 和 orderByDesc 倒序方法 +DB::table('user') + ->orderBy('id', 'desc') + ->get(); +// select * from `user` order by `id` desc + +// 按照创建时间倒序排,默认字段 created_at +DB::table('user')->latest('create_time')->toSql(); +// select * from `user` order by `create_time` desc + +//随机排序 +DB::table('user')->inRandomOrder()->get(); +// select * from `user` order by RAND() + +//从第 3 条开始,显示 3 条 +DB::table('user')->skip(2)->take(3)->toSql(); +// select * from `user` limit 3 offset 2 +DB::table('user')->offset(2)->limit(3)->get(); +// select * from `user` limit 3 offset 2 + +//when 实现条件选择 +DB::table('user')->when(true, + function ($query) { + $query->where('id', 19); + }, + function ($query) { + $query->where('name', 'Tom'); + } +)->get(); + +// true: select * from `user` where `id` = ? +// false: select * from `user` where `name` = ? + +// 如果MySQL在5.7+,有支持JSON数据的新特性; +DB::table('user')->where('list->id', 19)->first(); +// select * from `user` where json_unquote(json_extract(`list`, '$."id"')) = 19 limit 1 +``` + +## 子查询 + +```php +//通过 books 表数据,查询到 users 表关联的所有用户 +DB::table('users')->whereExists(function ($query) { + $query->selectRaw(1) ->from('books') + ->whereRaw('laravel_books.user_id = laravel_users.id'); +})->toSql(); +// select * from `users` where exists (select 1 from `books` where laravel_books.user_id = laravel_users.id) + +//whereRaw 这句也可以替代为:whereColumn('books.user_id','users.id'); +// PS:select 1 from,一般用于子查询的手段,目的是减少开销,提升效率 + +//id=子查询返回的 user_id +DB::table('users')->where('id', function ($query) { + $query->select('user_id') + ->from('books') + ->whereColumn('books.user_id','users.id'); +})->toSql(); +// select * from `users` where `id` = (select `user_id` from `books` where `books`.`user_id` = `users`.`id`) +``` + +## join 查询 + +```php +// join实现内联接的多表查询 +$sql = DB::table('users') + ->join('books', 'users.id', '=', 'books.user_id') + ->join('profiles', 'users.id', '=', 'profiles.user_id') + ->select('users.id', 'users.username', 'users.email','books.title', 'profiles.hobby') + ->toSql(); +// select `users`.`id`, `users`.`username`, `users`.`email`, `books`.`title`, `profiles`.`hobby` +// from `users` inner join `books` on `users`.`id` = `books`.`user_id` +// inner join `profiles` on `users`.`id` = `profiles`.`user_id` + +// 使用leftjoin左连接或rightjoin右连接 +$sql = DB::table('users') + ->leftJoin('books', 'users.id', '=', 'books.user_id') + ->rightjoin('profiles', 'users.id', '=', 'profiles.user_id') + ->toSql(); +// select * from `users` +// left join `books` on `users`.`id` = `books`.`user_id` +// right join `profiles` on `users`.`id` = `profiles`.`user_id` + +// crossjoin交叉连接查询,会生成笛卡尔积,再用distinct()取消重复 +DB::table('users') ->crossJoin('books') + ->select('username', 'email') + ->distinct() + ->toSql(); +// select distinct `username`, `email` +// from `users` cross join `books` + +// 实现闭包查询,和where类似,只不过要用on和orOn方法 +DB::table('users') ->join('books', function ($join) { + //支持 orOn 连缀 + $join->on('users.id', '=', 'books.user_id'); + })->toSql(); + +// select * from `users` +// inner join `books` on `users`.`id` = `books`.`user_id` + +// joinSub实现子连接查询 +$query = DB::table('books')->selectRaw('user_id,title'); +$users = DB::table('users')->joinSub($query,'books', function ($join) { + $join->on('users.id', '=', 'books.user_id'); +})->toSql(); +// select * from `users` +// inner join (select user_id,title from `books`) as `books` +// on `users`.`id` = `books`.`user_id` + +// union()或unionAll()方法实现两个查询的合并操作 +//union 取消重复,unionAll 不取消重复 +$query = DB::table('users'); +$users = DB::table('users') + ->union($query) + ->get(); +// (select * from `users`) union (select * from `users`) +``` diff --git a/index.html b/index.html index 074564f..8509fc6 100644 --- a/index.html +++ b/index.html @@ -5,19 +5,29 @@ Coding Tree - - + + - + content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0"> + - + @@ -128,8 +136,7 @@ - + -- GitLab