# 前言
學習一個框架, 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
留言