博客列表 >laravel基础-链式数据库操作和laravel中模型

laravel基础-链式数据库操作和laravel中模型

岂几岂几
岂几岂几原创
2020年06月23日 09:09:27939浏览

laravel基础-链式数据库操作和laravel中模型

1. laravel高级查询之链式调用

1.1 链式调用

  • 链式调用就是用使用不同的方法分别指定SQL语句的各个部分, 最后根据指定的数据拼装成SQL语句并执行.

  • 使用 DB::table(表名) 来指定查询的数据表名.

  • 使用 DB::select(字段名数组) 来指定查询的字段, 缺省值为 * .

  • 使用 DB::where(字段名, 操作符[缺省: = ], 字段值) 来指定where条件.

  • 使用 DB::orderBy(字段名, 排序方式) 来指定排序字段名和排序方式.

  • 使用 DB::groupBy(分组字段名数组) 来指定分组字段名.

  • 查询的结果中, 一条记录就是一个对象, 多条记录就是对象数组.

1.2 查询单条记录

  • 使用 DB::first() 来查询单条记录.
  1. /* 高级数据库查询方法[链式调用, 已做防注入] */
  2. /* 查询单条记录 */
  3. public function finds()
  4. {
  5. $res = DB::table('player')->first();
  6. printf('<pre>%s</pre>', print_r($query, true));
  7. print_r($query);
  8. }

1.3 查询多条记录

  • 使用 DB::get()->all() 来查询多条记录.
  1. /* 查询多条记录 */
  2. public function list()
  3. {
  4. // get()方法返回的是Collection类型的数据,
  5. /* 再调用all()方法就可以返回Collection中的纯数据了 */
  6. $data = DB::table('player')->select('*')->where('id', '<', 6)->get()->all();
  7. print('<pre>');
  8. print_r($data);
  9. }

1.4 指定like模糊查询条件

  • 使用 DB::where(字段名, 'like', 字段值) 来指定like模糊查询条件.

  • 少用like模糊查询, 或尽量使用 like 'xxx%' 方式的模糊查询.

  1. /* like模糊查询 */
  2. public function likes()
  3. {
  4. /* like会造成全表扫描, 性能较差, 若一定要用, 则最好是like 'xxx%'的形式, 即, 以准确的数据开始, 后面是%的 */
  5. $collection = DB::table('player')->select('name', 'position')->where('name', 'like', '拉%')->get();
  6. print_r($collection->all());
  7. }

1.5 多条件查询

  • 方法1: 使用重复链式调用 DB::where() 方法的方式来指定多个查询条件.

  • 方法2: 把多个查询条件组成二维数组, 传入 DB::where() 方法中

  1. /* 多条件查询 */
  2. public function wheres1()
  3. {
  4. // 重复调用where()方法
  5. $collection = DB::table('player')->select('name', 'position')->where('team', '湖人')->where('position', 'G')->get();
  6. print_r($collection->all());
  7. }
  8. public function wheres2()
  9. {
  10. // 查询条件缺省条件为"等于", 若是非等于条件, 则第二个数组成员为操作符.
  11. $wheres = [
  12. ['team', '湖人'],
  13. ['position', '<>' , 'G']
  14. ];
  15. // 传入查询条件数组
  16. $collection = DB::table('player')->select('name', 'position')->where($wheres)->get();
  17. print_r($collection->all());
  18. }

1.6 or查询条件

  • 使用 DB::orWhere() 来指定or查询条件
  1. /* or查询 */
  2. public function ors()
  3. {
  4. // 用orWhere()关联, 注意, 第一个必须是普通的where()
  5. $collection = DB::table('player')->select('name', 'position')->where('position', 'G')->orWhere('position', 'G-F')->get();
  6. print_r($collection->all());
  7. }

1.7 in查询条件

  • 使用 DB::whereIn() 来指定in查询条件

  • in查询的效率比其他非等于查询的效率要高, 在非等于查询中, 优先考虑用in查询

  1. /* in查询 */
  2. public function whereIn()
  3. {
  4. // 用whereIn()实现in操作
  5. $collection = DB::table('player')->select('name', 'position')->whereIn('id', [1, 2, 5])->get();
  6. print_r($collection->all());
  7. }

1.8 查看拼接成的查询SQL语句

  • 使用 DB::tosql() 方法查看拼接成的查询SQL语句

  • 好像不能查看insert, update和delete语句.

  1. public function tosql()
  2. {
  3. // 用tosql()
  4. $sql = DB::table('player')->select('name', 'position')->where('position', 'G')->orWhere('position', 'G-F')->tosql();
  5. print_r($sql);
  6. }
  • 另一种查看查询SQL的方式
  1. // 单数据库
  2. DB::connection()->enableQueryLog(); // 开启QueryLog
  3. $res = DB::table('admin')->where('id', $id)->update($admin);
  4. dump(DB::getQueryLog()); // 打印SQL执行情况
  1. // 多数据库中非默认数据库
  2. // 其中connection()指定在/config/database.php中定义的数据源名称('connections'配置项中的key值.)
  3. DB::connection('sqlsrv')->enableQueryLog(); // 开启QueryLog
  4. $res = DB::connection('sqlsrv')->table('admin')->where('id', $id)->update($admin);
  5. dump(DB::connection('sqlsrv')->getQueryLog()); // 打印SQL执行情况

1.9 关联查询和统计查询

  • 使用 DB::join() 方法来指定关联的表和关联条件

  • 使用 DB::avg() 方法来指定某个字段的平均值. 其他统计查询应该也是同名函数.

  1. /* 关联查询 */
  2. public function join()
  3. {
  4. $data = DB::table('player')->join('salary', 'player.id', '=', 'salary.player_id')->select('team')->groupBy('team')->avg('salary');
  5. print_r($data);
  6. }

1.10 插入一条记录

  • 使用 DB::insert() 方法来执行插入一条记录, 参数为一维数组, 表示要插入的一条记录.
  1. /* 插入1条记录 */
  2. public function create()
  3. {
  4. $res = DB::table('salary')->insert(['player_id' => 3, 'salary_year' => '2019-2020', 'salary' => '8000000']);
  5. print_r($res);
  6. }
  • 使用 DB::insertGetId() 方法来执行操作, 并返回插入成功后生成的记录id
  1. /* 插入记录, 并返回插入记录的id */
  2. public function insertGetId()
  3. {
  4. $salary1 = ['player_id' => 5, 'salary_year' => '2019-2020', 'salary' => '5000000'];
  5. $id = DB::table('salary')->insertGetId($salary1);
  6. print_r($id);
  7. }

1.11 批量插入数据

  • 使用 DB::insert() 方法来执行插入一条记录, 参数为二维数组, 表示要插入的多条记录.
  1. /* 插入多条记录 */
  2. public function batchInsert()
  3. {
  4. $salary1 = ['player_id' => 3, 'salary_year' => '2019-2020', 'salary' => '8000000'];
  5. $salary2 = ['player_id' => 4, 'salary_year' => '2019-2020', 'salary' => '10000000'];
  6. $salarys = [];
  7. $salarys[] = $salary1;
  8. $salarys[] = $salary2;
  9. $res = DB::table('salary')->insert($salarys);
  10. print_r($res);
  11. }

1.12 更新数据

  • 使用 DB::update() 方法来执行数据更新操作, 传入的参数为要更新的字段名和更新后的新值组成的数组.
  1. public function update1()
  2. {
  3. $updates = ['salary' => 3200000];
  4. $res = DB::table('salary')->where('player_id', 6)->update($updates);
  5. print_r($res);
  6. }

1.13 删除数据

  • 使用 DB::delete() 方法来执行数据删除操作.
  1. public function delete1()
  2. {
  3. print_r(DB::table('salary')->where('player_id', 6)->delete());
  4. }

2. laravel中的模型

  • 在laravel中, 模型的概念是被弱化的.

  • 使用模型类, 相当于 DB::table(tblName) 语句, 后可使用laravel链式操作数据库的所有操作方法. 但其查询返回值是一个模型对象数组, 每条记录是数组中对象的一个属性.

  • 可以使用artisan命令创建模型文件, 在laravel项目的根目录: php artisan make:model 模型名称 ;

    • 命令创建模型的路径是: /app/ ;

    • laravel建议把模型名称命名为其对应的数据库表名, 其中数据库表名为复数形式, 模型名称为单数形式. 假设数据库表是 articles , 则把对应的模型命名为: Article . 若模型名称跟对应的数据库表名不一致, 则需要在模型中创建一个名为 $tableprotected 属性, 其值为对应的数据表名.

模型操作示例:

1-模型类

  1. <?php
  2. namespace App;
  3. use Illuminate\Database\Eloquent\Model;
  4. class Article extends Model
  5. {
  6. // 指定表名(不指定的话, 默认表名是players, 模型名称+s, 烦人)
  7. protected $table = 'article';
  8. }

2-控制器@方法片段:

  1. public function articles(Article $article) {
  2. // 查询表中的所有数据
  3. $models = $article->get()->all();
  4. // 查询结果是一个对象
  5. dump($models);
  6. // 直接返回记录数组
  7. $datas = $article->get()->toArray();
  8. dump($datas);
  9. }

学习心得

  • 在实际开发中, 链式调用操作数据库的方式是最常用的, 应该熟练掌握.

  • 在web开发中, 尽量使用单表查询, 尽量使用”等于”操作; 若需要用 like 操作符, 则尽量是 xxx% 形式的值; MySQL中, in 的效率比其他非等于操作符的效率高.

  • 在laravel中, 模型的概念是被弱化的. 因为部分程序员把它作为业务逻辑的实现层, 而另一部分程序员把它作为跟数据库交互的持久化层. 是否使用模型, 取决于个人使用习惯.

声明:本文内容转载自脚本之家,由网友自发贡献,版权归原作者所有,如您发现涉嫌抄袭侵权,请联系admin@php.cn 核实处理。
全部评论
文明上网理性发言,请遵守新闻评论服务协议