Skip to main content

数据库查询用法--自我总结

[toc]

运行原生 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 方法

如果你已经有了一个查询构造器实例,并且希望在现有的查询语句中加入一个字段,那么你可以使用 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'];