# 前言
學習一個框架, Ray 的想法是, 在深入理解底層實作的原理之前, 應該先知道這個框架的 使用方法
; 先學習怎麼使用這個前人造的輪子, 再學習怎麼樣造一個輪子。
所以本篇文章重點在於細讀官方文件, 並將內容理解後以 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
留言