数据库使用基础


配置

Laravel让连接和使用数据库变得异常简单.数据库配置文件是 app/config/database.php.你可以在配置文件中定义所有你的数据库连接,以及指定默认连接.这个文件中已经提供了所有支持的数据库系统连接例子.

目前Laravel支持四种数据库系统: MySQL, Postgres, SQLite, 和 SQL Server.

读 / 写 连接 (读写分离配置)

你可能需要使用一个连接来处理 SELECT(读)数据操作,而另一个链接来处理 INSERT, UPDATE, 和 DELETE 这样的操作(即读写分离).Laravel是这项工作变得简单,它会在你直接发送查询语句、使用查询构建器或者Eloquent ORM时自动选择适当的连接(来实现读写分离).

以下是一个读/写 连接配置的例子:

  1. 'mysql' => array(
  2. 'read' => array(
  3. 'host' => '192.168.1.1',
  4. ),
  5. 'write' => array(
  6. 'host' => '196.168.1.2'
  7. ),
  8. 'driver' => 'mysql',
  9. 'database' => 'database',
  10. 'username' => 'root',
  11. 'password' => '',
  12. 'charset' => 'utf8',
  13. 'collation' => 'utf8_unicode_ci',
  14. 'prefix' => '',
  15. ),

注意看两个增加的配置数组: readwrite.这两个配置数组值都是一个键值对: host(用来标明连接的服务器).其余部分的配置由于 readwrite 是相同的,因此他们都在 mysql 下面被合并到了一起.因此,我们只需要修改 readwrite 配置中我们需要覆盖配置的值即可.在这个例子里, 192.168.1.1 将会做为"读"连接 而 192.168.1.2将会做为"写"连接.数据库的用户名密码,表前缀,字符集和其他的配置项目会在 mysql 配置下为两个连接所共用.

执行crud语句

一旦你已经配置好了数据库的连接,你就可以直接使用 DB 类来发送sql请求了.

运行一个 Select 查询

  1. $results = DB::select('select * from users where id = ?', array(1));

这里的 select 方法将会一直返回一个 array(数组) 结果集.

运行一个 Insert(插入) 请求

  1. DB::insert('insert into users (id, name) values (?, ?)', array(1, 'Dayle'));

运行一个 Update(更新) 请求

  1. DB::update('update users set votes = 100 where name = ?', array('John'));

运行一个 Delete(删除) 请求

  1. DB::delete('delete from users');

注意: update(更新) 和 delete(删除) 将会返回操作的影响行数(affect rows).

执行非crud操作

  1. DB::statement('drop table users');

监听数据库操作事件

你可以使用 DB::listen 方法来监听query事件:

  1. DB::listen(function($sql, $bindings, $time)
  2. {
  3. //
  4. });

事务

你可以用 transaction 方法来调用一个事务集合:

  1. DB::transaction(function()
  2. {
  3. DB::table('users')->update(array('votes' => 1));
  4. DB::table('posts')->delete();
  5. });

注意: 任何 transaction 抛出的异常都将导致事务自动回滚.

有时你需要自己手动开启一个事务:

  1. DB::beginTransaction();

你可以用过 rollback 方法手动回滚事务:

  1. DB::rollback();

最后,你可以使用 commit 方法来提交:

  1. DB::commit();

同时使用多个数据库系统

你可能使用很多的数据库系统,你可以使用 DB::connection 方法来选择使用它们:

  1. $users = DB::connection('foo')->select(...);

你可能需要在数据库系统的层面上操作数据库,使用PDO实例即可:

  1. $pdo = DB::connection()->getPdo();

使用reconnect方法重新连接一个指定的数据库系统:

  1. DB::reconnect('foo');

你可以使用 disconnect 方法来手动断开数据库连接,防止PDO连接数超过 max_connections 的限制:

  1. DB::disconnect('foo');

查询日志

Laravel默认会为当前请求执行的的所有查询生成日志并保存在内存中。 因此, 在某些特殊的情况下, 比如一次性向数据库中插入大量数据, 就可能导致内存不足。 在这种情况下,你可以通过 disableQueryLog 方法来关闭查询日志:

  1. DB::connection()->disableQueryLog();

调用 getQueryLog 方法可以同时获取多个查询执行后的日志:

  1. $queries = DB::getQueryLog();