批改状态:合格
老师批语:模型只是换个角度看数据库操作而已, 是否使用由开发者自行决定,谈不上弱化,只是有一些开发者喜爱操作底层
链式调用就是用使用不同的方法分别指定SQL语句的各个部分, 最后根据指定的数据拼装成SQL语句并执行.
使用 DB::table(表名) 来指定查询的数据表名.
使用 DB::select(字段名数组) 来指定查询的字段, 缺省值为 * .
使用 DB::where(字段名, 操作符[缺省: = ], 字段值) 来指定where条件.
使用 DB::orderBy(字段名, 排序方式) 来指定排序字段名和排序方式.
使用 DB::groupBy(分组字段名数组) 来指定分组字段名.
查询的结果中, 一条记录就是一个对象, 多条记录就是对象数组.
DB::first() 来查询单条记录.
/* 高级数据库查询方法[链式调用, 已做防注入] *//* 查询单条记录 */public function finds(){$res = DB::table('player')->first();printf('<pre>%s</pre>', print_r($query, true));print_r($query);}
DB::get()->all() 来查询多条记录.
/* 查询多条记录 */public function list(){// get()方法返回的是Collection类型的数据,/* 再调用all()方法就可以返回Collection中的纯数据了 */$data = DB::table('player')->select('*')->where('id', '<', 6)->get()->all();print('<pre>');print_r($data);}
使用 DB::where(字段名, 'like', 字段值) 来指定like模糊查询条件.
少用like模糊查询, 或尽量使用 like 'xxx%' 方式的模糊查询.
/* like模糊查询 */public function likes(){/* like会造成全表扫描, 性能较差, 若一定要用, 则最好是like 'xxx%'的形式, 即, 以准确的数据开始, 后面是%的 */$collection = DB::table('player')->select('name', 'position')->where('name', 'like', '拉%')->get();print_r($collection->all());}
方法1: 使用重复链式调用 DB::where() 方法的方式来指定多个查询条件.
方法2: 把多个查询条件组成二维数组, 传入 DB::where() 方法中
/* 多条件查询 */public function wheres1(){// 重复调用where()方法$collection = DB::table('player')->select('name', 'position')->where('team', '湖人')->where('position', 'G')->get();print_r($collection->all());}public function wheres2(){// 查询条件缺省条件为"等于", 若是非等于条件, 则第二个数组成员为操作符.$wheres = [['team', '湖人'],['position', '<>' , 'G']];// 传入查询条件数组$collection = DB::table('player')->select('name', 'position')->where($wheres)->get();print_r($collection->all());}
DB::orWhere() 来指定or查询条件
/* or查询 */public function ors(){// 用orWhere()关联, 注意, 第一个必须是普通的where()$collection = DB::table('player')->select('name', 'position')->where('position', 'G')->orWhere('position', 'G-F')->get();print_r($collection->all());}
使用 DB::whereIn() 来指定in查询条件
in查询的效率比其他非等于查询的效率要高, 在非等于查询中, 优先考虑用in查询
/* in查询 */public function whereIn(){// 用whereIn()实现in操作$collection = DB::table('player')->select('name', 'position')->whereIn('id', [1, 2, 5])->get();print_r($collection->all());}
使用 DB::tosql() 方法查看拼接成的查询SQL语句
好像不能查看insert, update和delete语句.
public function tosql(){// 用tosql()$sql = DB::table('player')->select('name', 'position')->where('position', 'G')->orWhere('position', 'G-F')->tosql();print_r($sql);}
// 单数据库DB::connection()->enableQueryLog(); // 开启QueryLog$res = DB::table('admin')->where('id', $id)->update($admin);dump(DB::getQueryLog()); // 打印SQL执行情况
// 多数据库中非默认数据库// 其中connection()指定在/config/database.php中定义的数据源名称('connections'配置项中的key值.)DB::connection('sqlsrv')->enableQueryLog(); // 开启QueryLog$res = DB::connection('sqlsrv')->table('admin')->where('id', $id)->update($admin);dump(DB::connection('sqlsrv')->getQueryLog()); // 打印SQL执行情况
使用 DB::join() 方法来指定关联的表和关联条件
使用 DB::avg() 方法来指定某个字段的平均值. 其他统计查询应该也是同名函数.
/* 关联查询 */public function join(){$data = DB::table('player')->join('salary', 'player.id', '=', 'salary.player_id')->select('team')->groupBy('team')->avg('salary');print_r($data);}
DB::insert() 方法来执行插入一条记录, 参数为一维数组, 表示要插入的一条记录.
/* 插入1条记录 */public function create(){$res = DB::table('salary')->insert(['player_id' => 3, 'salary_year' => '2019-2020', 'salary' => '8000000']);print_r($res);}
DB::insertGetId() 方法来执行操作, 并返回插入成功后生成的记录id
/* 插入记录, 并返回插入记录的id */public function insertGetId(){$salary1 = ['player_id' => 5, 'salary_year' => '2019-2020', 'salary' => '5000000'];$id = DB::table('salary')->insertGetId($salary1);print_r($id);}
DB::insert() 方法来执行插入一条记录, 参数为二维数组, 表示要插入的多条记录.
/* 插入多条记录 */public function batchInsert(){$salary1 = ['player_id' => 3, 'salary_year' => '2019-2020', 'salary' => '8000000'];$salary2 = ['player_id' => 4, 'salary_year' => '2019-2020', 'salary' => '10000000'];$salarys = [];$salarys[] = $salary1;$salarys[] = $salary2;$res = DB::table('salary')->insert($salarys);print_r($res);}
DB::update() 方法来执行数据更新操作, 传入的参数为要更新的字段名和更新后的新值组成的数组.
public function update1(){$updates = ['salary' => 3200000];$res = DB::table('salary')->where('player_id', 6)->update($updates);print_r($res);}
DB::delete() 方法来执行数据删除操作.
public function delete1(){print_r(DB::table('salary')->where('player_id', 6)->delete());}
在laravel中, 模型的概念是被弱化的.
使用模型类, 相当于 DB::table(tblName) 语句, 后可使用laravel链式操作数据库的所有操作方法. 但其查询返回值是一个模型对象数组, 每条记录是数组中对象的一个属性.
可以使用artisan命令创建模型文件, 在laravel项目的根目录: php artisan make:model 模型名称 ;
命令创建模型的路径是: /app/ ;
laravel建议把模型名称命名为其对应的数据库表名, 其中数据库表名为复数形式, 模型名称为单数形式. 假设数据库表是 articles , 则把对应的模型命名为: Article . 若模型名称跟对应的数据库表名不一致, 则需要在模型中创建一个名为 $table 的 protected 属性, 其值为对应的数据表名.
模型操作示例:
1-模型类
<?phpnamespace App;use Illuminate\Database\Eloquent\Model;class Article extends Model{// 指定表名(不指定的话, 默认表名是players, 模型名称+s, 烦人)protected $table = 'article';}
2-控制器@方法片段:
public function articles(Article $article) {// 查询表中的所有数据$models = $article->get()->all();// 查询结果是一个对象dump($models);// 直接返回记录数组$datas = $article->get()->toArray();dump($datas);}
在实际开发中, 链式调用操作数据库的方式是最常用的, 应该熟练掌握.
在web开发中, 尽量使用单表查询, 尽量使用”等于”操作; 若需要用 like 操作符, 则尽量是 xxx% 形式的值; MySQL中, in 的效率比其他非等于操作符的效率高.
在laravel中, 模型的概念是被弱化的. 因为部分程序员把它作为业务逻辑的实现层, 而另一部分程序员把它作为跟数据库交互的持久化层. 是否使用模型, 取决于个人使用习惯.
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号