连接数据库和运行查询是一个简单的过程,支持通过使用原始 SQL、查询构建器 或 Active Record 模型。管理数据库表和填充种子数据由 迁移和种子填充过程 处理。
原始 SQL 和使用查询构建器将执行得更快并应被用于简单任务。 Active Record 是一种被流行框架,Ruby On Rails 所使用的方法。 它提供了一个简易接口,用于执行创建、读取、更新和删除数据库记录等重复性任务。 您可以了解更多关于 维基百科上的活动记录模式。
一旦你配置好数据库连接,你就可以使用 Db 外观运行查询。Db 外观提供了每种查询类型的方法:select,update,insert,delete 和 statement。
要执行一个基本查询,请在 Db facade 上使用 select 方法。
$users = Db::select('select * from users where active = ?', [1]);传递给 select 方法的第一个参数是原始 SQL 查询,而第二个参数是需要绑定到查询的任何参数绑定。通常,这些是 where 子句约束的值。参数绑定提供针对 SQL 注入的保护。
select 方法将始终返回一个结果的 array。数组中的每个结果都将是一个 PHP stdClass 对象,允许你访问结果的值:
foreach ($users as $user) {
echo $user->name;
}与其使用 ? 来表示你的参数绑定,你可以使用命名绑定执行一个查询。
$results = Db::select('select * from users where id = :id', ['id' => 1]);如果数据库查询可能产生一个单一值,可以使用 scalar 方法来检索此值。
$count = Db::scalar('select count(*) as count from menu_items');要执行一个insert语句,您可以使用Db门面上的insert方法。与select类似,此方法将原始 SQL 查询作为第一个参数,将绑定作为第二个参数。
Db::insert('insert into users (id, name) values (?, ?)', [1, 'Joe']);该 update 方法应用于更新数据库中现有记录。该语句影响的行数将由该方法返回:
$affected = Db::update('update users set votes = 100 where name = ?', ['John']);delete 方法应该用于从数据库中删除记录。与 update 类似,将返回删除的行数:
$deleted = Db::delete('delete from users');某些数据库语句不应返回任何值。对于这类操作,您可以使用 Db 门面 上的 statement 方法。
Db::statement('drop table users');当 使用多个连接,你可以通过 Db 门面上的 connection 方法访问每个连接。传递给 connection 方法的 name 应该对应你 config/database.php 配置文件中列出的其中一个连接。
$users = Db::connection('foo')->select(...);您还可以使用连接实例上的 getPdo 方法,访问原始的、底层的 PDO 实例。
$pdo = Db::connection()->getPdo();要在数据库事务中运行一系列操作,你可以使用 Db 门面 上的 transaction 方法。如果在事务 Closure 中抛出异常,事务将自动回滚。如果 Closure 成功执行,事务将自动提交。你无需担心在使用 transaction 方法时手动回滚或提交。
Db::transaction(function () {
Db::table('users')->update(['votes' => 1]);
Db::table('posts')->delete();
});如果您想手动开始一个事务并完全控制回滚和提交,您可以使用 Db facade 上的 beginTransaction 方法:
Db::beginTransaction();你可以通过 rollBack 方法回滚事务:
Db::rollBack();最后,你可以通过 commit 方法提交事务:
Db::commit();如果您希望接收应用程序执行的每个 SQL 查询,您可以使用 listen 方法。此方法有助于记录查询或调试。
Db::listen(function($sql, $bindings, $time) {
//
});您可以在 插件注册文件 的 boot 方法中注册您的查询监听器。另外,插件可以在插件目录中提供一个名为 init.php 的文件,您可以使用该文件来放置此逻辑。
当启用查询日志功能时,一份记录了当前请求中所有已运行查询的日志会保留在内存中。调用 enableQueryLog 方法来启用此功能。
Db::connection()->enableQueryLog();要获取已执行查询的数组,您可以使用 getQueryLog 方法:
$queries = Db::getQueryLog();然而,在某些情况下,例如插入大量行时,这可能导致应用程序使用过多的内存。要禁用日志,你可以使用 disableQueryLog 方法:
Db::connection()->disableQueryLog();为了更快速地调试,调用
trace_sql辅助函数可能更有用。