laravel基础-链式数据库操作和laravel中模型
1. laravel高级查询之链式调用
1.1 链式调用
链式调用就是用使用不同的方法分别指定SQL语句的各个部分, 最后根据指定的数据拼装成SQL语句并执行.
使用
DB::table(表名)
来指定查询的数据表名.使用
DB::select(字段名数组)
来指定查询的字段, 缺省值为*
.使用
DB::where(字段名, 操作符[缺省: = ], 字段值)
来指定where条件.使用
DB::orderBy(字段名, 排序方式)
来指定排序字段名和排序方式.使用
DB::groupBy(分组字段名数组)
来指定分组字段名.查询的结果中, 一条记录就是一个对象, 多条记录就是对象数组.
1.2 查询单条记录
- 使用
DB::first()
来查询单条记录.
/* 高级数据库查询方法[链式调用, 已做防注入] */
/* 查询单条记录 */
public function finds()
{
$res = DB::table('player')->first();
printf('<pre>%s</pre>', print_r($query, true));
print_r($query);
}
1.3 查询多条记录
- 使用
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);
}
1.4 指定like模糊查询条件
使用
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.5 多条件查询
方法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());
}
1.6 or查询条件
- 使用
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());
}
1.7 in查询条件
使用
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());
}
1.8 查看拼接成的查询SQL语句
使用
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);
}
- 另一种查看查询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执行情况
1.9 关联查询和统计查询
使用
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);
}
1.10 插入一条记录
- 使用
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);
}
1.11 批量插入数据
- 使用
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);
}
1.12 更新数据
- 使用
DB::update()
方法来执行数据更新操作, 传入的参数为要更新的字段名和更新后的新值组成的数组.
public function update1()
{
$updates = ['salary' => 3200000];
$res = DB::table('salary')->where('player_id', 6)->update($updates);
print_r($res);
}
1.13 删除数据
- 使用
DB::delete()
方法来执行数据删除操作.
public function delete1()
{
print_r(DB::table('salary')->where('player_id', 6)->delete());
}
2. laravel中的模型
在laravel中, 模型的概念是被弱化的.
使用模型类, 相当于
DB::table(tblName)
语句, 后可使用laravel链式操作数据库的所有操作方法. 但其查询返回值是一个模型对象数组, 每条记录是数组中对象的一个属性.可以使用artisan命令创建模型文件, 在laravel项目的根目录:
php artisan make:model 模型名称
;命令创建模型的路径是:
/app/
;laravel建议把模型名称命名为其对应的数据库表名, 其中数据库表名为复数形式, 模型名称为单数形式. 假设数据库表是
articles
, 则把对应的模型命名为:Article
. 若模型名称跟对应的数据库表名不一致, 则需要在模型中创建一个名为$table
的protected
属性, 其值为对应的数据表名.
模型操作示例:
1-模型类
<?php
namespace 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中, 模型的概念是被弱化的. 因为部分程序员把它作为业务逻辑的实现层, 而另一部分程序员把它作为跟数据库交互的持久化层. 是否使用模型, 取决于个人使用习惯.