欢迎各位兄弟 发布技术文章

这里的技术是共享的

You are here

Laravel 5.1 文档攻略 —— 数据库:基础

shiping1 的头像

Laravel 5.1 文档攻略 —— 数据库:基础


概述

Laravel 支持4种数据库:

  1. MySQL
  2. Postgres
  3. SQLite
  4. SQL Server

Laravel 对数据库库的操作方式一共有3种:

  1. 写原生的SQL语句;
  2. Query Builder;
  3. Eloquent ORM;

其中第一,第二种,都是对数据表进行操作,第一种是写原生的SQL语句,第二种是用Laravel封装的方法对数据表进行操作(这些方法最终会转化为SQL语句)。
而第三种方法,也就是Eloquent ORM,则是对模型(数据对象)进行操作,是一种完全面向对象的数据操作方式(ORM),ORM使得数据操作变得更直观,更简单,更强大,例如建立表间关系,ORM有着明显的优势。

建议先学习第一,第二种方法。在实际中使用第三种方法。

配置数据库连接

配置文件:config/database.php
找到Mysql的部分:


  1. 'mysql' => [
  2. 'driver' => 'mysql',
  3. 'host' => env('DB_HOST', 'localhost'),
  4. 'database' => env('DB_DATABASE', 'forge'),
  5. 'username' => env('DB_USERNAME', 'forge'),
  6. 'password' => env('DB_PASSWORD', ''),
  7. 'charset' => 'utf8',
  8. 'collation' => 'utf8_unicode_ci',
  9. 'prefix' => '',
  10. 'strict' => false,
  11. ],

我们注意到'host' => env('DB_HOST', 'localhost'),这句,说明,.env文件有优先配置的权利,我们到.env中把数据库的关键信息填了:


  1. DB_HOST=localhost
  2. DB_DATABASE=larabase
  3. DB_USERNAME=root
  4. DB_PASSWORD=root

好了,这样就行了,你已经可以连接和使用数据库了。

数据库读写分离

为了提高数据库读写效率,服务器常常会进行读写分离的部署: 

在laravel中配置读写分离超级简单:


  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. ],

看到读(read)写(write)两个字了吗,在下面配置服务器信息就OK了,如果这两个数据库有共用的信息,你可以把它们写在外面,例如用户名密码这些都是读写数据库共用的。如果要使用独立的,就写到读写数组里面去。

太简单了,是因为不能更简单了。

执行原生的SQL查询

我们先来了解一下SQL语句的分类: 首先就是对数据的操作:『查改增删』 select, update, insert, delete;
然后就是对数据表和数据结构的一些操作(statement),例如删除一个表等等。

好,我们来看看laravel中怎样写这些语句:


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

后面那个1是参数,很好理解。

需要了解一下$users查出来的是一个什么东西,$user查出来是一个数组,数组里的每个值都是一个标准PHP对象,这样你就可以读取对象中的属性,实际用例:


  1. foreach ($users as $user) {
  2. //查出来后你就可以直接读取用户的名字
  3. echo $user->name;
  4. }

指定参数的键名


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

和上面写参数的方法对比一下就好,你可以看到要给参数加键名应该怎么写,这种情况适合有很多参数的情况使用。


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

显而易见,不解释了。注意后面的参数是按顺序注入的。


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


  1. $posts = DB::delete('delete from posts where id = ?', [3]);

普通的SQL Statement

对于不返回任何数据的SQL,这样写:


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

监听SQL事件


  1. <?php
  2.  
  3. namespace App\Providers;
  4.  
  5. use DB;
  6. use Illuminate\Support\ServiceProvider;
  7.  
  8. class AppServiceProvider extends ServiceProvider
  9. {
  10. /**
  11. * Bootstrap any application services.
  12. *
  13. * @return void
  14. */
  15. public function boot()
  16. {
  17. DB::listen(function($sql, $bindings, $time) {
  18. //
  19. });
  20. }
  21.  
  22. /**
  23. * Register the service provider.
  24. *
  25. * @return void
  26. */
  27. public function register()
  28. {
  29. //
  30. }
  31. }

放置事件侦听的位置在provider的boot()方法里, 这玩意儿有啥用呢?看闭包里的三个参数,每次有sql语句执行的时候,你都可以在这里获得 sql具体的语句,参数,以及执行时间,你可以把它们写到log里面去,主要用来调试和debug用。 当然,我在使用了无比强大的barryvdh/laravel-debugbar后,也就没怎么用过这个功能。

SQL语句批处理(Database Transactions)

所谓transaction,就是像交易一样一笔一笔的来处理。


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

如果你需要执行多个相关语句,可以写到transaction这个闭包参数里面。它有个好处就是如果这其中任何一条sql报错,它都会回滚到初始状态,只有全部无错通过了,才会写数据库。

注意DB::transaction(function () {});对后面要讲的QueryBuilder和Eloquent ORM也是适用的。

Transaction的手动写法

官网写得太简单了,看得有点晕,其实是这样的:


  1. DB::beginTransaction();

写了这句话后,下面所有的Sql语句都不会写数据库。

除非你在最后加上:


  1. DB::commit();

看着怎么有点像git:)

在上面两者之间的过程中,你可以用条件语句加入:


  1. DB::rollBack();

万一有什么不测的地方,就可以回滚。

连接多个数据库

有时候想调用其他数据库的内容:


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

前提是这个'foo'数据库,你之前在配置文件中配置过。

另外,这个connection对象还可以用来返回一个PDO对象:

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

来自 http://laravelbase.com/show/65
普通分类: