# 版本
# 前言
我喜歡使用 Laravel 開發的感覺, 除了開發快速, 程式碼簡潔且優雅之外, Laravel 框架本身也是一個很好的學習參照物。 本篇主要將官方文件重點整理成 Q&A 的形式呈現, 原子化的概念, 這方式並不適用於每個人, 但若對你有幫助, 我會很開心。
# 目錄
# Introduction
Laravel Database 中, 目前 Laravel 支援哪四種資料庫?
- MySQL
- PostgreSQL
- SQLite
- SQL Server
# Configuration
Laravel Database 中, 什麼是 Database URL?
將 host, port, username, password, 各項參數包含在內的一個 url
# Read & Write Connections
以下的 Laravel example code 的意思是?
- Example:
<?php
'mysql' => [
'read' => [
'host' => [
'192.168.1.1',
'196.168.1.2',
],
],
'write' => [
'host' => [
'196.168.1.3',
],
],
'sticky' => true,
'driver' => 'mysql',
'database' => 'database',
'username' => 'root',
'password' => '',
'charset' => 'utf8mb4',
'collation' => 'utf8mb4_unicode_ci',
'prefix' => '',
],
- Answer:
<?php
'mysql' => [
// 定義 read 的 mysql server
'read' => [
'host' => [
'192.168.1.1',
'196.168.1.2',
],
],
// 定義 write 的 mysql server
'write' => [
'host' => [
'196.168.1.3',
],
],
//如果一個 request 執行的 write 的動作, 在當次 request 的後續行為中, 如果有 read 的動作, 都將從 write 的機器讀取
'sticky' => true,
'driver' => 'mysql',
'database' => 'database',
'username' => 'root',
'password' => '',
'charset' => 'utf8mb4',
'collation' => 'utf8mb4_unicode_ci',
// table prefix, 如果有多個 application 使用同一個 database 的話, 避免衝突
'prefix' => '',
],
# Using Multiple Database Connections
以下的 Laravel example code 的意思是?
- Example:
<?php
$users = DB::connection('foo')->select(...);
- Answer: 指定使用的 DB
# Running Raw SQL Queries
# Running A Select Query
以下的 Laravel example code 的意思是?
- Example:
<?php
namespace App\Http\Controllers;
use App\Http\Controllers\Controller;
use Illuminate\Support\Facades\DB;
class UserController extends Controller
{
public function index()
{
$users = DB::select('select * from users where active = ?', [1]);
return view('user.index', ['users' => $users]);
}
}
- Answer: 相當於 select * from users where active = 1, 之所以使用 ? 為 binding 設計, 以避免 SQL injection 並 return 到 user.index view page, 像是 views/user/index.blade.php, 將 $user 以 ‘user’ 的方式帶過去該 page, 即可在 user.index page 以 $user 方式取用
# Using Named Bindings
以下的 Laravel example code 的意思是?
- Example:
<?php
$results = DB::select('select * from users where id = :id', ['id' => 1]);
- Answer: 使用 binding 以避免 sql injection, 如果 select() 的 arg2 是一個 numerically indexed array, 那就按順序使用
? (問號)
即可
# Running An Insert Statement
以下的 Laravel example code 的意思是?
- Example:
<?php
DB::insert('insert into users (id, name) values (?, ?)', [1, 'Dayle']);
- Answer: insert 到 users table 的 id, name column, value 為 1, ‘Dayle’
# Running An Update Statement
以下的 Laravel example code 的意思是?
- Example:
<?php
$affected = DB::update('update users set votes = 100 where name = ?', ['John']);
- Answer: 使用 update(), 輸入原生 sql 語法以及 binding, 以避免 sql injection
# Running A Delete Statement
以下的 Laravel example code 的意思是?
- Example:
<?php
$deleted = DB::delete('delete from users');
- Answer: 在 delete() 內輸入 mysql delete 語法, 刪除 users table 的所有資料
# Running A General Statement
以下的 Laravel example code 的意思是?
- Example:
<?php
DB::statement('drop table users');
- Answer: drop table users, 當使用一些不回傳 value 的指令, 可使用 STATEMENT
# Listening For Query Events
以下的 Laravel example code 的意思是?
- Example:
<?php
public function boot()
{
DB::listen(function ($query) {
// $query->sql
// $query->bindings
// $query->time
});
}
- Answer: 在 AppServiceProvider boot() 中, 使用 DB::listen(), 可取得每一句 query 的實際上 sql query, binding, 以及執行時間
# Database Transactions
Laravel Database 當中, 以下的 example 當中, 什麼情況下 transaction 會 roll back?
- Example:
<?php
DB::transaction(function () {
DB::table('users')->update(['votes' => 1]);
DB::table('posts')->delete();
});
- Answer: 當有 exception 被丟出的時候
# Handling Deadlocks
以下的 Laravel example code 的意思是?
- Example:
<?php
DB::transaction(function () {
DB::table('users')->update(['votes' => 1]);
DB::table('posts')->delete();
}, 5);
- Answer: 使用 transaction, 若失敗會持續嘗試最多 5 次, 5 次後仍然失敗丟出 exception
# Manually Using Transactions
以下的 Laravel example code 的意思是?
- Example:
<?php
DB::beginTransaction();
- Answer: 手動開始一個 transaction
以下的 Laravel example code 的意思是?
- Example:
<?php
DB::rollback();
- Answer: 手動 rollback 一個 transaction, 在
DB::beginTransaction() 之後的對資料庫的更動
都會 rollback
以下的 Laravel example code 的意思是?
- Example:
<?php
DB::commit();
- Answer: 手動 commit 一個 transaction, 在
DB::beginTransaction() 之後的對資料庫的更動
都會 commit