自我总结--用法精华
运行原生 SQL 查询
$results = DB::select('select * from users where id = :id', ['id' => 1]);
DB::insert('insert into users (id, name) values (?, ?)', [1, 'Dayle']);
$affected = DB::update('update users set votes = 100 where name = ?', ['John']);
$deleted = DB::delete('delete from users');
DB::statement('drop table users');
事务
transaction 方法接受一个可选的第二个参数 ,该参数用来表示事务发生死锁时重复执行的次数。一旦定义的次数尝试完毕,就会抛出一个异常:
DB::transaction(function () {
DB::table('users')->update(['votes' => 1]);
DB::table('posts')->delete();
}, 5);
手动使用事务
DB::beginTransaction();
DB::rollBack();
DB::commit();
查询构造器
查询
//获取用户列表。
$users = DB::table('users')->get();
从数据表中获取一行数据
DB::table('users')->where('name', 'John')->first();
获取单个值 value
$email = DB::table('users')->where('name', 'John')->value('email');
获取一列的值
$titles = DB::table('roles')->pluck('title');
返回的集合中指定字段的自定义键名:(会将 roles 表中的 name 字段当做键名,title 字段当做键值返回)
$roles = DB::table('roles')->pluck('title', 'name');
分块结果
//我们可以将全部 users表数据切割成一次处理 100 条记录的一小块
DB::table('users')->orderBy('id')->chunk(100, function ($users) {
foreach ($users as $user) {
}
//闭包 中返回 false 来终止继续获取分块结果
//return false;
});
//更新的时候最好使用 chunkById 方法
DB::table('users')->where('active', false)
->chunkById(100, function ($users) {
foreach ($users as $user) {
DB::table('users')
->where('id', $user->id)
->update(['active' => true]);
}
});
聚合
查询构造器还提供了各种聚合方法,比如 count, max,min, avg,还有 sum
判断记录是否存在
//除了通过 count 方法可以确定查询条件的结果是否存在之外,还可以使用 exists 和 doesntExist 方法:
return DB::table('orders')->where('finalized', 1)->exists();
return DB::table('orders')->where('finalized', 1)->doesntExist();
指定查询字段 select
$users = DB::table('users')->select('name', 'email as user_email')->get();
去重distinct
$users = DB::table('users')->distinct()->get();
Limit
$users = DB::table('users')->skip(10)->take(5)->get();
$users = DB::table('users')->offset(10)->limit(5)->get();
如果你已经有了一个查询构造器实例,并且希望在现有的查询语句中加入一个字段,那么你可以使用 addSelect 方法:
$query = DB::table('users')->select('name');
$users = $query->addSelect('age')->get();
原生表达式
$users = DB::table('users')
->select(DB::raw('count(*) as user_count, status'))
->where('status', '<>', 1)
->groupBy('status')
->get();
插入
DB::table('users')->insert(
['email' => 'john@example.com', 'votes' => 0]
);
批量插入
DB::table('users')->insert([
['email' => 'taylor@example.com', 'votes' => 0],
['email' => 'dayle@example.com', 'votes' => 0]
]);
insertOrIgnore 方法用于忽略重复插入记录到数据库的错误:
DB::table('users')->insertOrIgnore([
['id' => 1, 'email' => 'taylor@example.com'],
['id' => 2, 'email' => 'dayle@example.com']
]);
自增 ID insertGetId
$id = DB::table('users')->insertGetId( ['email' => 'john@example.com', 'votes' => 0]);
更新
更新 JSON 字段
$affected = DB::table('users')->where('id', 1)->update(['options->enabled' => true]);
自增 & 自减
DB::table('users')->increment('votes');
DB::table('users')->increment('votes', 5);
DB::table('users')->decrement('votes');
DB::table('users')->decrement('votes', 5);
清空表
DB::table('users')->truncate();
调试 输出查询结果或者 SQL 语句
DB::table('users')->where('votes', '>', 100)->dd();
DB::table('users')->where('votes', '>', 100)->dump();
Eloquent ORM
数据表名称
protected $table = 'my_flights';
主键
protected $primaryKey = 'flight_id';
指示模型主键是否递增
public $incrementing = false;
自动递增ID的“类型”。
protected $keyType = 'string';
是否自动写入时间
public $timestamps = false; //不写入,create方法有效
模型日期列的存储格式
protected $dateFormat = 'U'; //时间戳的方式
自定义存储时间戳的字段名
const CREATED_AT = 'creation_date';
const UPDATED_AT = 'last_update';
数据库连接
protected $connection = 'connection-name'; //模型的连接名称
默认属性值
protected $attributes = [
'delayed' => false,
];
可批量赋值的属性
protected $fillable = ['name'];
不可批量赋值的属性
protected $guarded = [];
软删除
// 设置为软删除
use SoftDeletes;
protected $dates = ['delete_at'];