laravel笔记-数据库(配置与基础)
写在前面
时间可贵,善用目录↑
学习Laravel的笔记,仅仅是作为laravel文档笔记,目的是强化对文档的理解,质量不高。
写在前面
关于MySQL的配置方法参见另一篇博客: laravel5 数据库配置(MySQL)
基本参数
支持的数据库:
-MySQL
-Postgres
-SQLite
-SQL Server
配置文件位置:config/database.php
基本配置操作:
SQLite:
DB_CONNECTION=sqlite
DB_DATABASE=/absolute/path/to/database.sqlite
SQL Server:
'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' => '',
],
使用原生SQL查询
通过DB门面可以运行原生SQL语句,DB门面提供了select, update, insert, delete和statement方法。
简单的例子
查询:
//原生SQL,第一个是SQL语句,第二个是插入的数据
$users = DB::select('select * from users where active = ?', [1]);
返回:以数组的形式返回结果集,数组中的每一个结果都是一个PHP StdClass对象
foreach ($users as $user) {
echo $user->name;
}
扩展
绑定数据:
除了使用?占位符来代表参数绑定外,还可以使用命名绑定来执行查询:
$results = DB::select('select * from users where id = :id', ['id' => 1]);
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');
骚操作
读写分离
使用一个数据库连接做查询,另一个数据库连接做插入、更新和删除。
'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' => '',
],
多个数据库连接
使用DB门面上的connection方法访问每个连接。
$users = DB::connection('database.php中定义的链接')->select(...);
如果想获得原生PDO可以如下:
$pdo = DB::connection()->getPdo();
监听SQL
DB门面的listen方法可以监听sql操作,我们可以在服务提供者中注册:
例如在之前例子中用到的:AppServiceProvider
namespace App\Providers;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\ServiceProvider;
class AppServiceProvider extends ServiceProvider
{
/**
* Bootstrap any application services.
*
* @return void
*/
public function boot()
{
//看这里~~
DB::listen(function ($query) {
// $query->sql
// $query->bindings
// $query->time
});
}
/**
* Register the service provider.
*
* @return void
*/
public function register()
{
//
}
}
数据库事务
就是BEGIN,ROBACK,COMMIT之类的
第一种方法:
使用DB门面的transaction方法,会自动提交或者回滚,不需要额外操作。
DB::transaction(function () {
DB::table('users')->update(['votes' => 1]);
DB::table('posts')->delete();
});
第二种方法:
手动开始事务,也是使用DB门面。
//开始
DB::beginTransaction();
//回滚
DB::rollBack();
//提交
DB::commit();