在前一篇我們提到laravel有兩種操作模式,
本篇來說說 Eloquent ORM 吧!
本文所採用的環境
- Max OSX 10.15
- Docker version 19.03.5
- Laradock
- Laravel 6.0 以上 (5.8適用)
本系列不從部署環境開始說起,
部署環境可參考以下
- Laradock - 更快速優雅的建立Laravel
- Install Apache, MySQL, PHP on macOS Catalina 10.15
- Win10請服用XAMPP,非專業版的Win裝docker會比較麻煩,不過也可以試試~~
本系列文章
Laravel之旅 - 認識Laravel資料夾結構
Laravel之旅 - 善用Migration管理資料表
Laravel之旅 - 生成Migration的懶人包
Laravel之旅 - DB的操作(1) DB Query builder
在前一篇有提到,Eloquent ORM需要維護Model,
所以我們就從Model開始說起吧!!!
在laravel初始時,有給了一個User.php,
我們也在Migration的時候就已經使用過該檔案了,
讓我們來看一下他裡頭有什麼吧,
Model - User.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41
| <?php
namespace App;
use Illuminate\Contracts\Auth\MustVerifyEmail; use Illuminate\Foundation\Auth\User as Authenticatable; use Illuminate\Notifications\Notifiable;
class User extends Authenticatable { use Notifiable;
protected $fillable = [ 'name', 'email', 'password', 'isAdmin' ];
protected $hidden = [ 'password', 'remember_token', ];
protected $casts = [ 'email_verified_at' => 'datetime', ]; }
|
Notifiable
是Laravel通知相關的模組,除了寄email以外還可以寄SMS、Slack,
本章節不會解釋該模組可以做什麼,有興趣可先看看這裡Laravel - Notifications
$fillable
這個陣列裡主要放table中有哪些column,可以定義也可以不用,
若漏定義的話,在insert的過程會漏掉columns,我通常都會定義它,
$hidden
當model的查詢結過使用toArray()
輸出時,
將會隱藏該欄位的值,這很方便可以將密碼欄位隱藏起來,
$casts
主要用在值得轉換,最簡單的例子就是 true / false
的值用 0 / 1
的方式儲存在資料庫中,
以上是User.php的內容,但還有一些比較常用的,
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
|
protected $table = 'users';
protected $primaryKey = 'user_id';
public $incrementing = false;
protected $keyType = 'string';
public $timestamps = false;
const CREATED_AT = 'creation_date'; const UPDATED_AT = 'last_update';
protected $connection = 'connection-name';
|
以上是Model中比較常用的設定,
讓我們來看看如何使用Model操作吧!!!
使用Model操作DB後,會回傳Collections型態的array,
Collections也提供了一些方法可以再查詢資料…等,
可以先看看這裡Laravel - Eloquent: Collections
以下是 Eloquent ORM的基本使用方法,
Eloquent ORM的CRUD
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46
|
User::find(1);
User::find([1, 2, 3]);
User::where('name', 'Yee');
User::where('age', '>', '18');
$query = [['name', '=', 'Yee'], ['age', '>', '18']] User::where($query);
User::whereNull('name')->get(); User::whereNotNull('name')->get();
$user = new User; $user->name = 'Yee'; ... $user->save();
$attributes = [['name'=>'Yee', 'email'=>'yee@gmail.com']]; $user = User::create($attributes);
$user = User::find(1); $user->name = 'Yee2'; $user->save();
$user = User::where($query)->update($attributes);
User::find(1)->delete();
|
建議使用 deleted_at
欄位,可以存時間戳或者 true / false
來表示該筆資料是否被刪除,
delete_at
在 migration 中為 $table->softDeletes();
,
我都稱他為軟刪除,可以讓使用者操作刪除,但不真實的把資料刪除,
可以避免user手殘…等意外,也能有完整的資料流,
以上的條件式的結尾可以用
1 2 3 4 5
| User::find(1)->first();
User::where('age', '>', '18')->get();
|
更進階的用法有這些
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
| User::find(1)->firstOrFail()
User::where('name', 'Yee')->firstOr(['name', 'Yee2'])
$user = User::firstOrNew( ['email' => 'yee@gmail.com'], ['name' => 'yee'] );
$user->save();
$user = User::firstOrCreate( ['email' => 'yee@gmail.com'], ['name' => 'Yee'] );
$user = User::updateOrCreate( ['email' => 'yee@gmail.com'], ['name' => 'Yee'] );
|
以上是我比較常用跟常見的操作方法,
更多方法可以看這邊Laravel - Eloquent
後記
某些成面來說 Eloquent ORM 跟 Query builder的用法蠻像的,
所以Query builder有的方法,在Eloquent ORM也大部分都有,只是要再查詢一下用法,
Eloquent ORM 除了以上的操作外,也可以設定資料表關聯,
可以免除寫很多join的條件式,
下篇再來跟大家講解 relationships 的部分。