ORM簡單介紹
在Laravel中,ORM的主要工具是Eloquent。Eloquent提供了一種直覺式的方法來操作資料庫,讓資料表和模型之間建立了一對一或一對多的映射關係。以下是一些ORM操作的基本用法。
ORM資料種類
Laravel撈資料幾種類型:
- ORM:Eloquent 模型,可以$data->$field和$data[$field],有getter,setter
- QueryBuilder:關連數組(ArrayAccess),只能$data->$field,也有getter,setter(僅限一維以下才有,因為是stdClass)
Laravel兩種常用特別的資料格式:
- Collection: Laravel內建物件,有很多內建用法,但是存取資料基本上以陣列索引訪問為主
1 2
| $a = ['a' => 123]; $a = collect($a);
|
- StdClass: PHP原生的物件,簡單來說就是讓資料可以對象屬性訪問
1 2
| $a = ['a' => 123]; $a = (object) ($a);
|
使用ORM基本觀念
- 使用create、update、fill(批量賦值)時,要先設定fillable(白名單)或guarded(黑名單),否則會無法寫入
1 2 3 4 5 6 7 8 9
| protected $fillable = [ 'field1', 'field2', ];
protected $guarded = [ 'field3', 'field4', ];
|
ORM常見用法
撈資料常用方法
- where常用方法
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 47 48 49 50 51 52
| $query->where('id', '1');
$query->where([ ['id', '1'], ['date', '<=', date("Y-m-d H:i:s")] ]);
$query->where([ ['id' => '1'], ['date' => '<=', date("Y-m-d H:i:s")] ]);
$query->where(function ($query) { $query->where('created_at', '>=', date("Y-m-d H:i:s")) ->orWhereNull('created_at'); });
$query->where([ ['id', '1'], ['date', '<=', date("Y-m-d H:i:s")], function ($query) { $query->where('created_at', '>=', date("Y-m-d H:i:s")) ->orWhereNull('created_at'); } ]);
$query->whereIn('id', [1, 2, 3, 4]);
$query->whereBetween('id', [1, 10]);
$query->whereNotBetween('id', [1, 10]);
$query->whereNull('created_at');
$query->whereNotNull('created_at');
$query->whereHas('comments');
$query->whereDoesntHave('comments');
|
- 其餘方法
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 47 48 49
| $resource = $query->select('id');
$resource = $query->pluck('id');
$resource = $query->count();
$resource = $query->exists();
$resource = $query->max('id');
$resource = $query->min('id');
$resource = $query->avg('id');
$resource = $query->toBase();
$query->chunk(100, function ($resource) { foreach ($resource as $value) { } });
$query->tap(function ($query) use ($request) { if ($request->has('search') && $request->search != '') { $query->where('title', 'like', '%' . $request->search . '%'); } });
$posts = App\Post::has('comments')->get();
$comments = $post->comments;
$posts = App\Post::doesntHave('comments')->get();
$resource = $query->whereDoesntHave('comments');
|
- 善用with,可以一次撈出多筆資料,例如:一次撈出user、profile、posts
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| $users = User::all();
foreach ($users as $user) { echo $user->profile->name; echo $user->posts->title; }
$users = User::with(['profile', 'posts'])->get(); foreach ($users as $user) { echo $user->profile->name; echo $user->posts->title; }
$query->with(['data', 'data2']);
$query->withTrashed(['data', 'data2']);
|
CUD常用方法
- create、update、delete常用方法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| $model->create([ 'field1' => 'value1', 'field2' => 'value2', ]);
$model->update([ 'field1' => 'value1', 'field2' => 'value2', ]);
$model->delete();
$model->forceDelete();
$model->restore();
|
- 假捨想要無視批量賦值的限制,可以使用forceFill、forceCreate、forceUpdate
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| $model->forceFill([ 'field1' => 'value1', 'field2' => 'value2', ]);
$model->forceCreate([ 'field1' => 'value1', 'field2' => 'value2', ]);
$model->forceUpdate([ 'field1' => 'value1', 'field2' => 'value2', ]);
|
- 複製資料
1 2 3 4 5
| $model->replicate();
$model->replicate()->save();
|
- 使用create、update、delete時,會自動更新updated_at欄位,如果不想要更新,可以使用updateTimestamps(),但是要注意,這個方法會把created_at、updated_at都設為null
1 2
| $model->updateTimestamps(); $model->save();
|
其餘常用方法
- 要把撈出的資料刪除,一樣使用迴圈unset
1 2 3
| foreach ($resource as $key => $value) { unset($resource[$key]); }
|