基本数据库使用
配置
Laravel 使得连接数据库和运行查询变得极其简单。数据库配置文件是 config/database.php
。在这个文件中,你可以定义所有的数据库连接,并指定默认使用哪个连接。文件中提供了所有支持的数据库系统的示例。
目前,Laravel 支持四种数据库系统:MySQL、Postgres、SQLite 和 SQL Server。
读/写连接
有时你可能希望使用一个数据库连接来执行 SELECT 语句,而使用另一个连接来执行 INSERT、UPDATE 和 DELETE 语句。Laravel 使这变得非常简单,无论你是使用原始查询、查询构建器还是 Eloquent ORM,都会使用正确的连接。
要查看如何配置读/写连接,让我们看这个例子:
'mysql' => [
'read' => [
'host' => '192.168.1.1',
],
'write' => [
'host' => '196.168.1.2'
],
'driver' => 'mysql',
'database' => 'database',
'username' => 'root',
'password' => '',
'charset' => 'utf8',
'collation' => 'utf8_unicode_ci',
'prefix' => '',
],
注意,配置数组中添加了两个键:read
和 write
。这两个键都有一个包含单个键 host
的数组值。read
和 write
连接的其余数据库选项将从主 mysql
数组中合并。因此,我们只需要在 read
和 write
数组中放置项目,如果我们希望覆盖主数组中的值。在这种情况下,192.168.1.1
将用作“读”连接,而 192.168.1.2
将用作“写”连接。数据库凭据、前缀、字符集和主 mysql
数组中的所有其他选项将在两个连接之间共享。
运行查询
一旦你配置了数据库连接,你可以使用 DB
facade 运行查询。
运行一个 Select 查询
$results = DB::select('select * from users where id = ?', [1]);
select
方法将始终返回一个结果的 array
。
你也可以使用命名绑定执行查询:
$results = DB::select('select * from users where id = :id', ['id' => 1]);
运行一个 Insert 语句
DB::insert('insert into users (id, name) values (?, ?)', [1, 'Dayle']);
运行一个 Update 语句
DB::update('update users set votes = 100 where name = ?', ['John']);
运行一个 Delete 语句
DB::delete('delete from users');
NOTE
update
和 delete
语句返回受操作影响的行数。
运行一个通用语句
DB::statement('drop table users');
监听查询事件
你可以使用 DB::listen
方法监听查询事件:
DB::listen(function($sql, $bindings, $time)
{
//
});
数据库事务
要在数据库事务中运行一组操作,你可以使用 transaction
方法:
DB::transaction(function()
{
DB::table('users')->update(['votes' => 1]);
DB::table('posts')->delete();
});
NOTE
在 transaction
闭包中抛出的任何异常都会导致事务自动回滚。
有时你可能需要自己开始一个事务:
DB::beginTransaction();
你可以通过 rollback
方法回滚一个事务:
DB::rollback();
最后,你可以通过 commit
方法提交一个事务:
DB::commit();
访问连接
使用多个连接时,你可以通过 DB::connection
方法访问它们:
$users = DB::connection('foo')->select(...);
你也可以访问原始的底层 PDO 实例:
$pdo = DB::connection()->getPdo();
有时你可能需要重新连接到给定的数据库:
DB::reconnect('foo');
如果由于超过底层 PDO 实例的 max_connections
限制而需要断开给定数据库的连接,请使用 disconnect
方法:
DB::disconnect('foo');
查询日志
Laravel 可以选择性地在内存中记录当前请求运行的所有查询。请注意,在某些情况下,例如插入大量行时,这可能导致应用程序使用过多的内存。要启用日志,你可以使用 enableQueryLog
方法:
DB::connection()->enableQueryLog();
要获取已执行查询的数组,你可以使用 getQueryLog
方法:
$queries = DB::getQueryLog();