Laravel - 数据库 - Database


[ 数据库配置 ]

配置SQLite

在 .env 文件中进行修改

DB_CONNECTION=sqlite
DB_DATABASE=/absolute/path/to/database.sqlite
配置SQL Server

在config/database.php 中进行修改, 添加一个 sqlsrv 数组

'connections' => [
    ...

    'sqlsrv' => [
        'driver' => 'sqlsrv',
        'host' => env('DB_HOST', 'localhost'),
        'database' => env('DB_DATABASE', 'forge'),
        'username' => env('DB_USERNAME', 'forge'),
        'password' => env('DB_PASSWORD', ''),
        'charset' => 'utf8',
        'prefix' => '',
    ],

    ...
]
读写分离
'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'    => '',
],
多读写分离
'mysql' => [
    'read' => [
        ['host' => '192.168.1.1'],
        ['host' => '192.168.1.2'],
    ],
    'write' => [
        ['host' => '196.168.1.3'],
        ['host' => '196.168.1.4']
    ],
    'driver'    => 'mysql',
    'database'  => 'database',
    'username'  => 'root',
    'password'  => '',
    'charset'   => 'utf8',
    'collation' => 'utf8_unicode_ci',
    'prefix'    => '',
],
读写分离源码分析

https://laravel-china.org/topics/1879/laravel-5-configuration-read-and-write-separation-and-source-analysis

使用多数据库连接

config/database.php中定义好的数据库连接 name作为 connection 的参数进行传递。

比如 , 配置文件中

'foo' => [
    'driver' => 'mysql',
    'host' => env('DB_HOST', '127.0.0.1'),
    'port' => env('DB_PORT', '3306'),
    'database' => env('DB_DATABASE', 'foo'),
    'username' => env('DB_USERNAME', 'foo'),
    'password' => env('DB_PASSWORD', ''),
    'unix_socket' => env('DB_SOCKET', ''),
    'charset' => 'utf8mb4',
    'collation' => 'utf8mb4_unicode_ci',
    'prefix' => '',
    'strict' => true,
    'engine' => null,
],
'nb' => [
    'driver' => 'mysql',
    'host' => env('DB2_HOST', '1xx.154.xxx.1'),
    'port' => env('DB2_PORT', '3306'),
    'database' => env('DB2_DATABASE', 'nb'),
    'username' => env('DB2_USERNAME', 'nb'),
    'password' => env('DB2_PASSWORD', ''),
    'unix_socket' => env('DB2_SOCKET', ''),
    'charset' => 'utf8mb4',
    'collation' => 'utf8mb4_unicode_ci',
    'prefix' => '',
    'strict' => true,
    'engine' => null,
],

使用的时候就可以如下

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

$number_z = DB::connection('nb')->select(...);

[ 使用原生语句 ]

在程序中可以使用,DB facade来执行查询, DB facade 提供了 select , update , insert , delete 和 statement

public function index()
{
    //查询 主键id 为 1 的骑士.
    $id_one = DB::select('select * from riders  where id = ?',[1]);

    //查询名字为 Delta, 踢力为 8 的骑士
    //$id_one = DB::select('select * from riders  where name = ? and kick = ?',['Delta','8']);

    //查询id 为 1,2,3 的骑士. 
    //PS. Mysql中 in是没有办法接收数组PDO的,但可以用 find_in_set() 代替。 YII中也可以这样用。
    //$in_all = DB::select('select * from riders  where find_in_set( id, ? )',['1,2,3']);

    dd($id_one);
}
命名绑定

除了使用 ? 来进行绑定之外。一样可以使用通常的绑定模式

$id_one = DB::select('select * from riders  where name = :name and kick = :kick',['name'=>'Delta','kick'=>'8']);
insert语句
DB::insert('insert into users (id, name) values (?, ?)', [1, 'Dayle']);
update语句
$affected = DB::update('update users set votes = 100 where name = ?', ['John']);
delete语句
$deleted = DB::delete('delete from users');
一般声明语句
DB::statement('drop table users');
DB::statement('set foreign_key_checks = 0');

[ 监听查询事件 ]

如果你希望能够监控到程序执行的每一条 SQL 语句,那么你可以使用 listen方法。 该方法对查询日志和调试非常有用,你可以在 服务容器中注册该方法:

<?php

namespace App\Providers;

use Illuminate\Support\Facades\DB;
use Illuminate\Support\ServiceProvider;

class AppServiceProvider extends ServiceProvider
{
    /**
     * 启动应用服务。
     *
     * @return void
     */
    public function boot()
    {
        DB::listen(function ($query) {
            // $query->sql
            // $query->bindings
            // $query->time
        });
    }

    /**
     * 注册服务提供者。
     *
     * @return void
     */
    public function register()
    {
        //
    }
}

[ 事务 ]

想要在一个数据库事务中运行一连串操作,可以使用 DBfacade 的 transaction方法

DB::transaction(function () {
    DB::table('users')->update(['votes' => 1]);

    DB::table('posts')->delete();
});
手动事务
//开始手动
DB::beginTransaction();
//事务提交
DB::commit();
//不行,提交失败了,手动回滚
DB::rollBack();

使用 DBfacade 的事务方法也适用于 Eloquent ORM和 查询语句构造器。

results matching ""

    No results matching ""