连接到数据库和运行查询是一个简单的过程,支持通过使用原始 SQL、查询构建器 或 活跃记录模型。管理数据库表和填充种子数据由 迁移和种子填充过程 处理。
原始 SQL 和使用查询构建器将执行速度更快,并应用于简单任务。Active Record 是一种由流行的框架, Ruby On Rails 所使用的方法。它提供了一个简单的接口用于执行重复性任务,例如创建, 读取, 更新和删除数据库记录。您可以了解更多关于 Wikipedia 上的 Active Record 模式。
一旦您配置好数据库连接,您就可以使用 Db Facade 运行查询。Db Facade 为每种查询类型提供了方法:select, update, insert, delete, and statement。
要运行一个基本查询,请在 Db 门面上使用 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 facade 上的 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 facade 上的 connection 方法访问每个连接。传递给 connection 方法的 name 应该对应着你的 config/database.php 配置文件中列出的其中一个连接。
$users = Db::connection('foo')->select(...);你也可以使用连接实例上的 getPdo 方法来访问原始的、底层的 PDO 实例。
$pdo = Db::connection()->getPdo();要在数据库事务中运行一系列操作,您可以使用transaction方法在Db Facade 上。如果在事务Closure中抛出异常,事务将自动回滚。如果Closure成功执行,事务将自动提交。在使用transaction方法时,您无需担心手动回滚或提交。
Db::transaction(function () {
Db::table('users')->update(['votes' => 1]);
Db::table('posts')->delete();
});如果您想手动开始一个事务,并完全控制回滚和提交,您可以使用 Db 门面上的 beginTransaction 方法:
Db::beginTransaction();你可以通过 rollBack 方法回滚事务:
Db::rollBack();最后, 您可以通过 commit 方法提交事务:
Db::commit();Using the
Dbfacade's transaction methods also controls transactions for the query builder and model queries.
如果你想接收应用程序执行的每个 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辅助函数 反而可能更有用。