Laravel 的 Eloquent ORM学习
創建模型
首先,創建一個 Eloquent 模型,生成的模型通常放在 app 目錄中,但你可以通過 composer.json 隨意地將它們放在可被自動加載的地方。所有的 Eloquent 模型都繼承了 Illuminate\Database\Eloquent\Model 類。
示例:
| 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 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 | <?php namespace DriverTaskEditor\Models\Dao; use DriverTaskEditor\Core\Dao; use DriverTaskEditor\Common\Constant; class ActivityDao extends Dao { /** *(1)數據表名,必填 @var string */ protected $table = 'activity'; /** *(2)主鍵,可選 @var int * Eloquent 也會假定每個數據表都有一個名為 id 的主鍵字段。你可以定義一個受保護的 $primaryKey 屬性來覆蓋這個約定。 * Eloquent 假定主鍵是一個遞增的整數值,這意味著在默認情況下主鍵會自動轉換為 int。 如果使用的是非遞增或者非數字的主鍵,則必須在模型上設置 public $incrementing = false。如果主鍵不是一個整數,則應該在模型上設置 protected $keyType = string */ /** *(3)要連接的數據庫(database.php中的key),可選,默認'default',@var string */ protected $connection = 'driver_task'; /** * (4)必填:強轉主鍵值類型; 使用toArray方法時,組件會根據主鍵自增類型,將主鍵類型轉換為int; * 故需要通過$casts再轉回string,有些模型有這個變量有些沒有,@var array */ protected $casts = [ 'segments' => 'array', 'segment_conditions'=> 'array', 'cities' => 'array', 'status' => 'int', 'group_id' => 'int', 'trigger_type' => 'int', 'product_id' => 'int', 'product_line' => 'array', 'evaluate_info' => 'array', 'task_ids' => 'array', 'extra' => 'array', 'render_info' => 'array', ]; /** * (5)需要被轉換成日期的屬性。 * * @var array */ protected $dates = [ 'create_time', 'modify_time', ]; /** * (6)列表中的字段不可被批量賦值(create方法創建時不會寫入該字段) * $guarded和$fillable 二選一,一個表示黑名單,一個表示白名單 * @var array */ protected $guarded = ['id']; /** * (7)該模型是否被自動維護時間戳,可選,@var bool,默認為true * Eloquent 會默認數據表中存在 created_at 和 updated_at這兩個字段,如果你不需要這兩個字段,則需要在模型內將 $timestamps 屬性設置為 false */ /** * (8)如果需要自定義用于存儲時間戳的字段名,可在模型中通過設置 CREATED_AT 和 UPDATED_AT 常量來實現: * 更新時間和修改時間的字段,如果沒有則設置public $timestamps = false; */ const CREATED_AT = 'create_time'; const UPDATED_AT = 'modify_time'; } |
查詢
檢索多個模型
Eloquent 的 all 方法會返回模型表中所有的結果。
| 1 2 3 4 5 6 7 8 9 | <?php use App\Flight; $flights = App\Flight::all(); foreach ($flights as $flight) { echo $flight->name; } |
由于每個 Eloquent 模型都可以當作一個 查詢構造器,因此你還可以在查詢中添加約束,然后使用 get 方法來獲取結果:
| 1 2 3 4 | $flights = App\Flight::where('active', 1) ->orderBy('name', 'desc') ->take(10) ->get(); |
注意: Eloquent 模型是查詢構造器,因此你應當去閱讀 查詢構造器 提供的所有方法,以便你可以在 Eloquent 查詢中使用。
集合
1、分塊結果:如果需要處理數千個 Eloquent 記錄,可以使用 chunk 命令。chunk 方法會檢索 Eloquent 模型的「分塊」,將它們提供給指定的 Closure 進行處理。在處理大型結果集時,使用 chunk 方法可節省內存:
| 1 2 3 4 | Flight::chunk(200, function ($flights) { foreach ($flights as $flight) { // } |
注意:傳遞到方法的第一個參數是希望每個「分塊」接收的數據量。閉包則被作為第二個參數傳遞,它會在每次執行數據庫查詢傳遞每個塊時被調用。
2、使用游標:cursor 允許你使用游標來遍歷數據庫數據,該游標只執行一個查詢。處理大量數據時,可以使用 cursor 方法可以大幅度減少內存的使用量:
| 1 2 3 | foreach (Flight::where('foo', 'bar')->cursor() as $flight) { // } |
檢索單個模型/集合
除了從指定的數據表檢索所有記錄外,你也可以通過 find 或 first 方法來檢索單條記錄。這些方法不是返回一組模型,而是返回一個模型實例:
| 1 2 3 4 5 | // 通過主鍵取回一個模型... $flight = App\Flight::find(1); // 取回符合查詢限制的第一個模型 ... $flight = App\Flight::where('active', 1)->first(); |
你也可以用主鍵數組為參數調用 find 方法,它將返回匹配記錄的集合:
| 1 | $flights = App\Flight::find([1, 2, 3]); |
「找不到」異常
如果你希望在找不到模型時拋出異常,可以使用 findOrFail 以及 firstOrFail 方法。這些方法會檢索查詢的第一個結果。如果沒有找到相應結果,就會拋出一個
| 1 2 3 4 5 | Illuminate\Database\Eloquent\ModelNotFoundException: $model = App\Flight::findOrFail(1); $model = App\Flight::where('legs', '>', 100)->firstOrFail(); |
如果沒有對異常進行捕獲,則會自動返回 HTTP 404 響應給用戶。也就是說,在使用這些方法時,不需要另外寫個檢查來返回 404 響應:
| 1 2 3 | Route::get('/api/flights/{id}', function ($id) { return App\Flight::findOrFail($id); }); |
你還可以使用 查詢構造器 提供的 count、sum、max 以及其它 聚合函數。這些方法只會返回適當的標量值而不是整個模型實例:
| 1 2 3 | $count = App\Flight::where('active', 1)->count(); $max = App\Flight::where('active', 1)->max('price'); |
插入和更新模型
1、save方法插入新數據。
要在數據庫中創建新記錄,只需創建一個新的模型實例,并在模型上設置屬性,然后調用 save 方法:
| 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 | //插入 $flight = new Flight; $flight->name = $request->name; $flight->save(); $flight = App\Flight::create(['name' => 'Flight 10']); //如果你已經有一個模型實例,你可以傳遞數組給 fill 方法: $flight->fill(['name' => 'Flight 22']); /* * 其他創建方法 */ // 通過 name 屬性檢索航班,當結果不存在時創建它... $flight = App\Flight::firstOrCreate(['name' => 'Flight 10']); // 通過 name 屬性檢索航班,當結果不存在的時候用 name 屬性和 delayed 屬性去創建它 $flight = App\Flight::firstOrCreate( ['name' => 'Flight 10'], ['delayed' => 1] ); // 通過 name 屬性檢索航班,當結果不存在時實例化... $flight = App\Flight::firstOrNew(['name' => 'Flight 10']); // 通過 name 屬性檢索航班,當結果不存在的時候用 name 屬性和 delayed 屬性實例化 $flight = App\Flight::firstOrNew( ['name' => 'Flight 10'], ['delayed' => 1] ); //updateOrCreate // 如果有從奧克蘭飛往圣地亞哥的航班,將價格設為 99 美元 // 如果不存在匹配的模型就創建一個 $flight = App\Flight::updateOrCreate( ['departure' => 'Oakland', 'destination' => 'San Diego'], ['price' => 99] ); |
2、更新
| 1 2 3 4 5 | //批量插入,update 方法需要傳入表示要更新的字段的字段的值的鍵值對數組。 App\Flight::where('active', 1) ->where('destination', 'San Diego') ->update(['delayed' => 1]); |
3、刪除
可以在模型實例上調用 delete 方法來刪除模型:
| 1 2 3 4 5 6 7 8 9 10 11 12 | //通過主鍵刪除 $flight = App\Flight::find(1); $flight->delete(); //如果你已知道了這個模型的主鍵,則可以直接調用 destroy 方法刪除它: App\Flight::destroy(1); App\Flight::destroy([1, 2, 3]); App\Flight::destroy(1, 2, 3); //通過查詢刪除模型 $deletedRows = App\Flight::where('active', 0)->delete(); //注意:使用 Eloquent 執行批量刪除語句時,deleting 和 deleted 模型事件不會為已刪除的模型觸發。因為在執行刪除語句時,不會檢索模型實例。 |
參考:
Eloquent: 入門
轉載請注明:本文檔由 Laravel China 社區 laravel-china.org 組織翻譯,詳見 翻譯召集帖。
總結
以上是生活随笔為你收集整理的Laravel 的 Eloquent ORM学习的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 火山底下的岩浆网是这样的
- 下一篇: 机构:移动语音市场 2026 年底将降至