数据库:入门

介绍

连接到数据库和运行查询是一个简单的过程,可以使用原始SQL,查询构建器活动记录模型来支持。 管理数据库表和填充种子数据由migration and seeder process处理。

原始SQL和使用查询构建器将执行得更快,应该用于简单的任务。 Active Record是流行框架Ruby On Rails使用的一种方法。 它允许一个简单的界面来执行重复的任务,如创建,读取,更新和删除数据库记录。 您可以了解有关维基百科上的活动记录模式的更多信息。

配置

应用程序的数据库配置位于config/database.php文件中。 在此文件中,您可以定义所有数据库连接,以及指定默认情况下应使用的连接。 此文件中提供了所有受支持的数据库系统的示例。

读/写连接

有时您可能希望为SELECT语句使用一个数据库连接,而对INSERT,UPDATE和DELETE语句使用另一个数据库连接。 无论您使用的是原始查询,查询构建器还是模型,都可以轻松指定使用哪个连接。

要了解应如何配置读/写连接,让我们看一下这个例子:

  1. 'mysql' => [
  2. 'read' => [
  3. 'host' => '192.168.1.1',
  4. ],
  5. 'write' => [
  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。 这两个键的数组值都包含一个键:hostreadwrite连接的其余数据库选项将从主mysql数组合并。

如果我们希望覆盖主数组中的值,我们只需要在readwrite数组中放置项。 因此,在这种情况下,192.168.1.1将用作“读”连接,而192.168.1.2将用作“写”连接。 主mysql数组中的数据库凭据,前缀,字符集和所有其他选项将在两个连接中共享。

运行原始SQL查询

配置数据库连接后,可以使用Db facade运行查询。 Db facade为每种类型的查询提供了方法:selectupdateinsertdeletestatement

运行选择查询

要运行基本查询,我们可以在Dbfacade上使用select方法:

  1. $users = Db::select('select * from users where active = ?', [1]);

传递给select方法的第一个参数是原始SQL查询,而第二个参数是需要绑定到查询的任何参数绑定。 通常,这些是where子句约束的值。 参数绑定提供了针对SQL注入的保护。

select方法将始终返回结果的数组。 数组中的每个结果都是一个PHPstdClass对象,允许您访问结果的值:

  1. foreach ($users as $user) {
  2. echo $user->name;
  3. }

使用命名绑定

您可以使用命名绑定执行查询,而不是使用来表示参数绑定:

  1. $results = Db::select('select * from users where id = :id', ['id' => 1]);

运行insert语句

要执行insert语句,可以在Dbfacade上使用insert方法。 与select类似,此方法将原始SQL查询作为其第一个参数,并将绑定作为第二个参数:

  1. Db::insert('insert into users (id, name) values (?, ?)', [1, 'Joe']);

运行更新语句

应使用update方法更新数据库中的现有记录。 该语句将返回受该语句影响的行数:

  1. $affected = Db::update('update users set votes = 100 where name = ?', ['John']);

运行删除语句

应该使用delete方法从数据库中删除记录。 与update一样,将返回已删除的行数:

  1. $deleted = Db::delete('delete from users');

运行一般性声明

某些数据库语句不应返回任何值。 对于这些类型的操作,您可以在Dbfacade上使用statement方法:

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

多个数据库连接

使用多个连接时,您可以通过Dbfacade上的connection方法访问每个连接。 传递给connection方法的name应该对应于config/database.php配置文件中列出的连接之一:

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

您还可以使用连接实例上的getPdo方法访问原始的底层PDO实例:

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

数据库事务

要在数据库事务中运行一组操作,可以在Dbfacade上使用transaction方法。 如果在事务Closure中抛出异常,则事务将自动回滚。 如果Closure成功执行,则事务将自动提交。 使用transaction方法时,您无需担心手动回滚或提交:

  1. Db::transaction(function () {
  2. Db::table('users')->update(['votes' => 1]);
  3. Db::table('posts')->delete();
  4. });

手动使用事务

如果您想手动开始事务并完全控制回滚和提交,可以在Dbfacade上使用beginTransaction方法:

  1. Db::beginTransaction();

您可以通过rollBack方法回滚事务:

  1. Db::rollBack();

最后,您可以通过commit方法提交事务:

  1. Db::commit();

注意: 使用Db facade的事务方法还控制查询构建器model queries的事务。

数据库事件

如果您希望接收应用程序执行的每个SQL查询,可以使用listen方法。 此方法对于记录查询或调试很有用。

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

就像事件注册,一样,你可以在插件注册文件boot方法中注册你的查询监听器。 或者,插件可以在插件目录中提供名为init.php的文件,您可以使用该文件来放置此逻辑。

查询日志记录

启用查询日志记录后,会在内存中保留已为当前请求运行的所有查询。 调用enableQueryLog方法来启用此功能。

  1. Db::connection()->enableQueryLog();

要获取已执行查询的数组,可以使用getQueryLog方法:

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

但是,在某些情况下,例如插入大量行时,这可能会导致应用程序使用过多的内存。 要禁用日志,可以使用disableQueryLog方法:

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

注意: 为了更快地调试,调用trace_sql 帮助方法 可能更有用。