Laravel - Database - Getting Started (官方文件原子化翻譯筆記)

# 前言

學習一個框架, 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
Laravel - Database - Query Builder (官方文件原子化翻譯筆記) Laravel - Digging Deeper - Collections

留言

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×