Ray Lee | 李宗叡
Learn or Die
Published in
8 min readJan 11, 2021

--

Photo by Jan Antonin Kolar on Unsplash

# 版本

Laravel 7.x

# 前言

我喜歡使用 Laravel 開發的感覺, 除了開發快速, 程式碼簡潔且優雅之外, Laravel 框架本身也是一個很好的學習參照物。 本篇主要將官方文件重點整理成 Q&A 的形式呈現, 原子化的概念, 這方式並不適用於每個人, 但若對你有幫助, 我會很開心。

# 目錄

Laravel — 官方文件原子化翻譯 — 目錄

# 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

--

--

Ray Lee | 李宗叡
Learn or Die

It's Ray. I do both backend and frontend, but more focus on backend. I like coding, and would like to see the whole picture of a product.