基本数据库使用
配置
Laravel 使得连接数据库和运行查询变得极其简单。数据库配置文件是 app/config/database.php
。在这个文件中,您可以定义所有的数据库连接,并指定默认使用哪个连接。该文件中提供了所有支持的数据库系统的示例。
目前,Laravel 支持四种数据库系统:MySQL、Postgres、SQLite 和 SQL Server。
读/写连接
有时您可能希望使用一个数据库连接进行 SELECT 语句,而使用另一个连接进行 INSERT、UPDATE 和 DELETE 语句。Laravel 使这变得轻而易举,无论您使用原始查询、查询构建器还是 Eloquent ORM,都会自动使用正确的连接。
要查看如何配置读/写连接,让我们看一下这个示例:
'mysql' => array(
'read' => array(
'host' => '192.168.1.1',
),
'write' => array(
'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
类运行查询。
运行 SELECT 查询
$results = DB::select('select * from users where id = ?', array(1));
select
方法将始终返回一个 array
的结果。
运行 INSERT 语句
DB::insert('insert into users (id, name) values (?, ?)', array(1, 'Dayle'));
运行 UPDATE 语句
DB::update('update users set votes = 100 where name = ?', array('John'));
运行 DELETE 语句
DB::delete('delete from users');
update
和 delete
语句返回受操作影响的行数。
运行一般语句
DB::statement('drop table users');
监听查询事件
您可以使用 DB::listen
方法监听查询事件:
DB::listen(function($sql, $bindings, $time)
{
//
});
数据库事务
要在数据库事务中运行一组操作,您可以使用 transaction
方法:
DB::transaction(function()
{
DB::table('users')->update(array('votes' => 1));
DB::table('posts')->delete();
});
在 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 会在当前请求中保留所有已运行查询的内存日志。然而,在某些情况下,例如插入大量行时,这可能会导致应用程序使用过多内存。要禁用日志,您可以使用 disableQueryLog
方法:
DB::connection()->disableQueryLog();
要获取已执行查询的数组,您可以使用 getQueryLog
方法:
$queries = DB::getQueryLog();