Blogger Information
Blog 57
fans 3
comment 0
visits 60346
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
laravel基础-链式数据库操作和laravel中模型
岂几岂几
Original
932 people have browsed it

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

Correcting teacher:天蓬老师天蓬老师

Correction status:qualified

Teacher's comments:模型只是换个角度看数据库操作而已, 是否使用由开发者自行决定,谈不上弱化,只是有一些开发者喜爱操作底层
Statement of this Website
The copyright of this blog article belongs to the blogger. Please specify the address when reprinting! If there is any infringement or violation of the law, please contact admin@php.cn Report processing!
All comments Speak rationally on civilized internet, please comply with News Comment Service Agreement
0 comments
Author's latest blog post
About us Disclaimer Sitemap
php.cn:Public welfare online PHP training,Help PHP learners grow quickly!