PHP Laravel - DataBase 應用 - 筆記長也NotesHazuya

PHP Laravel - DataBase 應用

2020-06-04 10:12:14   Laravel

DataBase 存取方法

在 laravel 當中有提供直接下 sql 語句以及 ORM 映射兩種資料庫操作方法,而原生 PHP 當中則包含了 mysqli 以及 PDO 兩種。

由於 PDO 以及 mysqli 是屬於 PHP 原生提供的方法,這邊就不再說明。本篇文章將會說明直接存取以及 ORM 兩種存取資料庫的方法。

.env 設定

開始之前,要先到應用程式的環境設定檔把 DB 的基本資料放進去。

DB_CONNECTION=mysql
DB_HOST=localhost
DB_PORT=8889
DB_DATABASE=
DB_USERNAME=
DB_PASSWORD=

基本上需要修改的就是這幾行,其中包含了你要連線的資料庫類型主機名稱PORT資料庫名稱、資料庫使用者的帳號密碼

而目前 laravel 主要支援這些資料庫:

  • MySQL
  • PostgreSQL
  • SQLite
  • SQL Server
  • REDIS

同場加映:.env

1.基本上這個檔案預設會被放入 .gitignore 當中,進行 git 的時候會被忽略,而通常很多人也都建議不要將帶有敏 感資料的檔案上傳到 git。

2.這個檔案還可以設定其他有關你應用程式或是 mail 等相關設定。

因為在網站最常使用的還是 mysql ,所以本文會以 mysql 來進行。

如果把 DB 都設定完了,那就可以來進行操作了~

資料表

為了說明方便,我們統一使用下列格式的資料表,你可以使用你習慣的方式建立資料表(例如 PhpMyAdmin、SequelPro等)。

userTable

userID

( int , 3)

userName

( varchar, 255 )

email

( varchar, 255 )

1 abc abc@abc.com

原生 SQL 語法

這個方法是直接下 sql 指令對 db 進行操作,這個方法也是我自己最習慣的方法。

connection

首先,先利用 DB::connection()來進行連線,我們使用 mysql 就在資料庫類型填入 mysql 即可。

DB::connection('資料庫類型')

以下 select、insert、update、delete 方法都帶有兩個參數,一是查詢的語句,如果要帶入查詢參數以佔位符號 " ? " 表示,二是查詢參數的內容,會依序對應到語句當中的 " ? "。

select

$user = DB::select('select * from userTable where userID = ?', [1]);

這個方法會回傳 stdClass 陣列,如果想取用資料可以這樣做:

echo $user[0]->userID

每個陣列裡面都是一個物件,會對應表的欄位名稱。這樣就能搭配 foreach 等方法取用資料。

insert

DB::insert('insert into users (userID, userName, email) values (?, ?, ?)', [2, 'ted', 'ted@abc.com']);

update

$updateUser = DB::update('update users set userName = ? where userID = ?', ['def', 1]);

update 會回傳受到影響的行數。

delete

$deleted = DB::delete('delete from users where userID = ?', [1]);

delete 也會回傳受影響的行數。

執行一般陳述式

DB::statement('drop table users');

DB 事件監聽

DB::listen(function ($query) {
  //
});

監聽到 DB 操作,會執行閉包。

Transactions

為避免中間 DB 出錯而導致資料不同步問題,例如銀行轉帳轉出扣款了,而轉入方卻因為錯誤而沒有寫入金額,為了避免這種事情發生, sql 有這個交易機制。

交易機制當中,一但中間出現任何錯誤,所有操作都會被復原。

DB::transaction(function () {
  //
});

Eloquent ORM

ORM ( Object-Relational Mapping ) 是將關聯資料庫映射到物件的一種技術。簡言之,就是將資料庫變成程式當中的 class ,透過操作物件來存取資料庫。

當今熱門的語言如 python 以及 php 都有提供 ORM 的套件可供使用, laravel 也不例外,作為熱門的 PHP 框架也提供了優雅的 ORM 操作方式。

建立 Model

在專案目錄下,透過指令建立 model

php artisan make:model userTable

建立好之後可以在 app 目錄下看到 userTable.php 已經被建立,只有最基本的內容。

namespace App;

use Illuminate\Database\Eloquent\Model;

class userTable extends Model
{
    //
}

 對應的 Table

 基本上 laravel 會認為你的 table 名稱為 user_tables,如果你的命名方式不同,可以在 class 中新增下面的變數來指定映射的 table。

protected $table = 'userTable';

在Laravel中命名的習慣是:

  • 資料表使用英文複數;Model使用英文單數
  • 資料表用小寫,單字間用蛇底式命名(Snake Case);Model用首字大寫大駝峰式命名(Upper Camel Case)

主鍵

預設會認為你的 table 有一個欄位叫做 Id,會預設作為主鍵,如果不是,一樣可以新增這個變數來指定主鍵。

protected $primarykey = "userID"

created_at跟updated_at

在 laravel 的 ORM 當中預設會認為你的 table 有 created_at 跟 updated_at 欄位來記錄時間,如果你沒有想關掉的話一樣新增這個變數。

public $timestamps = false;

這樣就能關閉時間戳記了。

select

use App\userTable;

$user = userTable::all();
foreach ($user as $user) {
    echo $user->userID;
}

比起語句,簡潔不少吧~

加上一些查詢條件

$user = userTable::where('userID', '=', '1') // userid == 1
               ->orderBy('userID', 'desc') // userID由高到低排列
               ->take(1) // 只取前1筆資料
               ->get();

insert

$newUser = new userTable;
$newUser -> userName = 'io';
$newUser -> email = 'j@j.com';

$newUser -> save();

新增 model 物件,給定值,最後儲存。

update

$user = userTable::where('userID', '=', '2')->update(['userName'=>'IJoke']);

或是

$user = userTable::find(2);

$user->userName = 'IJoke';

$user->save();

delete

$user = userTable::where('userID', '=', '2')->delete();

或是

$user = userTable::find(2);

$user->delete();

 

關於 DB 的部分就介紹到這裡,下一篇文章將會介紹 view 以及 blade 樣板。