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' => '',
],
读写分离源码分析
使用多数据库连接
在 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()
{
//
}
}
[ 事务 ]
想要在一个数据库事务中运行一连串操作,可以使用 DB
facade 的 transaction
方法
DB::transaction(function () {
DB::table('users')->update(['votes' => 1]);
DB::table('posts')->delete();
});
手动事务
//开始手动
DB::beginTransaction();
//事务提交
DB::commit();
//不行,提交失败了,手动回滚
DB::rollBack();
使用 DB
facade 的事务方法也适用于 Eloquent ORM和 查询语句构造器。