iT邦幫忙

2019 iT 邦幫忙鐵人賽

DAY 12
0
自我挑戰組

來用Laravel做點什麼吧系列 第 12

D12 Model, Eloquent, ORM(2)

  • 分享至 

  • xImage
  •  

ano,先繼續Model架構設計的話題。

在小型Project的時候,怎麼寫其實都沒差,反正就那點程式碼。但當Project越來越大的時候,沒有好好規劃整個Project的架構就會很難維護。如果我都不規劃、把所有程式碼都塞一起,今天我要增加一個功能,我還要一行一行翻看看我會動到什麼,想想就頭好痛。

我們其實可以把Model再拆成三個部分:Entity、Repository、Service

Entity可以理解為昨天提到的、定義資料表的部分。它單純定義Eloquent Model的相關設定,就是昨天講到的部分。

Repository是處理資料庫的邏輯部分,就是學資料庫時會用到的增刪改查,與Entity是一對一的關係,一張資料表對應一組使用該資料表的邏輯。

Service顧名思義是服務相關、也就是商業邏輯,介於Controller與Model之間,整個應用相關的邏輯都可以算在這裡,再細分下去。

好了,回到Eloquent。

我們知道怎麼設定Eloquent Model,接著要來看增刪改查。

// 取出所有資料
$allCat = Cat::all();
$allCat = Cat::get();

// 篩選
$allCat = Cat::where('name', '小黑')->get;

直接使用get()這個函式也可以取出所有資料,相當於all(),但增加查詢條件時就只能使用get(),總的來說統一使用get()會比較好。

$cat = new Cat;
$cat->name = '小白';
$cat->age = '2';
$cat->save();

或是

$cat = new Cat([
    'name' => '小白',
    'age' => '2'
]);
$cat->save();

兩者結果都會插入資料到資料表中,只是後者是用陣列的方式。而這兩種方式在使用save()之前都不會把資料存入資料庫。

$cat = Cat::create([
    'name' => '小白',
    'age' => '2'
]);

直接使用Model::create則會直接使用create()方法,就不用再加上save()Model::update也是同理。

最後是刪除,Eloquent除了提供刪除方法還提供了「虛刪除」,也就是「標記是否被刪除」。當我們可能會再把資料還原回來時,用虛刪除可以很快就把「刪掉」的資料還原,但也要注意如果一直使用虛刪除資料庫會越來越大。

$cat = Cat::where('name', '小花')->delete();

這是搭配查詢來刪除叫做「小花」的貓貓資料,如果你知道小花貓貓的編號(主鍵)是「87」,也可以透過Cat::destroy(87)來刪除小花的貓貓資料。

Schema::table('cats', fuction (Blueprint $table) {
    $table -> softDeletes();
});

使用虛刪除前要先在資料表中新增一個欄位,接著:

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\SoftDeletes;

class Cat extends Model
{
    use SoftDeletes;
    
    protected $dates = ['delete_at'];
}

這樣便啟用需刪除功能,之後再使用delete()destroy()方法時,就會在這個欄位註記而不是直接刪除。


上一篇
D11 Model, Eloquent, ORM(1)
下一篇
D13 Middleware
系列文
來用Laravel做點什麼吧30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言