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 Database config example 中, read 代表的意思是?
  • Example:

    <?php
    'mysql' => [
    // read 的意思是?
    '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:
    當 request 是 read 的話, 要讀取哪一台機器

以下的 Laravel Database config example 中, write 代表的意思是?
  • Example:

    <?php
    'mysql' => [
    'read' => [
    'host' => [
    '192.168.1.1',
    '196.168.1.2',
    ],
    ],
    // write 的意思是?
    'write' => [
    'host' => [
    '196.168.1.3',
    ],
    ],
    'sticky' => true,
    'driver' => 'mysql',
    'database' => 'database',
    'username' => 'root',
    'password' => '',
    'charset' => 'utf8mb4',
    'collation' => 'utf8mb4_unicode_ci',
    'prefix' => '',
    ],
  • Answer:
    當 request 是 write 的話, 要讀取哪一台機器

以下的 Laravel Database config example 中, sticky 代表的意思是?
  • Example:

    <?php
    'mysql' => [
    'read' => [
    'host' => [
    '192.168.1.1',
    '196.168.1.2',
    ],
    ],
    'write' => [
    'host' => [
    '196.168.1.3',
    ],
    ],
    // sticky 的意思是?
    'sticky' => true,
    'driver' => 'mysql',
    'database' => 'database',
    'username' => 'root',
    'password' => '',
    'charset' => 'utf8mb4',
    'collation' => 'utf8mb4_unicode_ci',
    'prefix' => '',
    ],
  • Answer:
    如果一個 request 執行的 write 的動作, 在當次 request 的後續行為中, 如果有 read 的動作, 都將從 write 的機器讀取

Using Multiple Database Connections

Laravel Database 當中, 如果我要取得特定的 database connection 名為 ‘foo’, 在以下的 example 當中, 該使用哪個 method?
  • Example:

    <?php
    $users = DB::這裡是?('foo')->select(...);
  • Answer:

    <?php
    $users = DB::connection('foo')->select(...);




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 Database 當中, 以下的 example 當中, binding 處該填入?
  • Example:

    <?php
    $results = DB::select('select * from users where id = 這裡是?', ['id' => 1]);
  • Answer:

    <?php
    $results = DB::select('select * from users where id = :id', ['id' => 1]);


Running An Insert Statement

Laravel Database 當中, 如果我要執行 insert 指令, 在以下的 example 中, 該使用哪個 method?
  • Example:

    <?php
    DB::這裡是?('insert into users (id, name) values (?, ?)', [1, 'Dayle']);
  • Answer:

    <?php
    DB::insert('insert into users (id, name) values (?, ?)', [1, 'Dayle']);


Running An Update Statement

Laravel Database 當中, 如果我要執行 update 指令, 在以下的 example 中, 該使用哪個 method?
  • Example:

    <?php
    $affected = DB::這裡是?('update users set votes = 100 where name = ?', ['John']);
  • Answer:

    <?php
    $affected = DB::update('update users set votes = 100 where name = ?', ['John']);


Running A Delete Statement

Laravel Database 當中, 如果我要執行 Delete 指令, 在以下的 example 中, 該使用哪個 method?
  • Example:

    <?php
    $deleted = DB::這裡是?('delete from users');
  • Answer:

    <?php
    $deleted = DB::delete('delete from users');


Running A General Statement

Laravel Database 當中, 如果我要執行一些不回傳 value 的指令, 在以下的 example 中, 該使用哪個 method?
  • Example:

    <?php
    DB::這裡是?('drop table users');
  • Answer:

    <?php
    DB::statement('drop table users');




Listening For Query Events

Laravel Database 當中, 如果我要收到執行的每一句 SQL query, 可以在 哪個 class 中定義以下的 example
  • Example:

    <?php
    public function boot()
    {
    DB::listen(function ($query) {
    // $query->sql
    // $query->bindings
    // $query->time
    });
    }
  • Answer:
    AppServiceProvider




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 Database 當中, 以下的 example 中, 如果我想要讓 transaction 進行 5 次的 attempts, 5 次都失敗後才丟出 exception, 那該怎麼做?
  • Example:

    <?php
    DB::transaction(function () {
    DB::table('users')->update(['votes' => 1]);

    DB::table('posts')->delete();
    }, 這裡是?);
  • Answer:

    <?php
    DB::transaction(function () {
    DB::table('users')->update(['votes' => 1]);

    DB::table('posts')->delete();
    }, 5);


Manually Using Transactions

Laravel Database 當中, 如果要手動的開始一個 transaction, 可以使用 DB class 的哪個 method?
  • Example:

    <?php
    DB::這裡是?();
  • Answer:

    <?php
    DB::beginTransaction();
Laravel Database 當中, 如果使用 DB::beginTransaction() 來 manually control transaction 時, 如果要 rollback, 在以下的 example 中, 該怎麼做?
  • Example:

    <?php
    DB::這裡是?();
  • Answer:

    <?php
    DB::rollback();
Laravel Database 當中, 如果使用 DB::beginTransaction() 來 manually control transaction 時, 如果確定沒有問題, 要提交該 transaction 時, 在以下的 example 中, 該怎麼做?
  • Example:

    <?php
    DB::這裡是?();
  • Answer:

    <?php
    DB::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

×