ORM模型簡介
1>什么是ORM?
ORM,即 Object-Relational Mapping(對象關系映射),它的作用是在關系型數據庫和業務實體對象之間作一個映射,這樣,我們在操作具體的 業務對象時,就不需要再去和復雜的SQL語句打交道,只需簡單的操作對象的屬性和方法即可。
2>ORM 兩種最常見的實現方式是 ActiveRecord 和 DataMapper,
ActiveRecord(非常流行) 中模型與數據表一一對應,
DataMapper 中模型與數據表是完全分離的。
3>Laravel 的 Eloquent ORM 使用 ActiveRecord 實現方式,每一個 Eloquent 模型類對應着數據庫中的一張表,我們通過調用模型類的相應方法實現對數據庫的增刪改查。
4>由於 Eloquent 模型是查詢構造器,你可在 Eloquent 查找中使用查詢構造器的任何方法。
1 定義模型
1.1創建model模型
1.1.1 模型通常放在 app 目錄中,也可以放在任何可通過 composer.json 自動加載的地方。(app文件夾下的內容會被自動加載,建議在app下建立models文件夾,)
1.1.2 所有的 Eloquent 模型都繼承自 Illuminate\Database\Eloquent\Model 類。
1.1.3 模型約定, 針對 'flights' 數據表,模型類名為 'Flight',注意單復數。
1.1.4 創建模型實例的最簡單方法是使用 make:model artisan命令
php artisan make:model Flight
創建模型的同時生成數據庫遷移,
php artisan make:model UserAccount --migration //兩個橫線
php artisan make:model UserAccount -m //一個橫線
注意:
1>使用大駝峰表示,模型名是單數形式,遷移文件中數據表名是蛇形復數,
2>以上例子中模型文件名和類名是 UserAccount.php ,
3>遷移文件名是2017_08_10_131759_create_user_accounts_table.php,遷移文件中使用的表名是 user_accounts
1.1.5 生成的文件位於app目錄下,然后將文件移動到models文件夾下,再更改下命名空間
1.2模型約定
主要是以下幾個方面:表名,主鍵,時間,日期格式,數據庫
class Flight extends Model { /** * 與模型關聯的數據表。 */ protected $table = 'flight'; /** * 指定主鍵。 */ public $primaryKey = 'id'; /** * 指定是否模型應該被戳記時間。 */ public $timestamps = false; /** * 模型的日期字段保存格式。 */ protected $dateFormat = 'U'; /** * 此模型的連接名稱。 */ protected $connection = 'connection-name'; }
分別解釋上面的定義:
1>表名:除非數據表明確地指定了其它名稱,否則將使用類的「蛇形名稱」、復數形式名稱來作為數據表的名稱。例子中,Eloquent 將會假設 Flight 模型被存儲記錄在 flights 數據表中。
2>主鍵:默認,Eloquent 模型認為每張表主鍵為 id 。可以定義一個 $primaryKey 屬性來重寫。
3>時間戳:默認,Eloquent 會預計你的數據表中有 created_at 和 updated_at 字段。將 $timestamps 屬性設置為 false,則不會自動維護這兩個字段。
4>時間戳格式:在模型內設置 $dateFormat 屬性。這個屬性決定了日期應如何在數據庫中存儲,以及當模型被序列化成數組或 JSON 時的格式:
5>數據庫連接:默認,會使用應用程序中默認的數據庫連接設置。想為模型指定不同的連接,可以使用 $connection 屬性:
2 添加模型(增)
2.1 基本添加,save方法
返回值:true或者false
//首先創建一個新模型實例 $flight = new Flight; //給這個模型添加屬性 $flight->name = $name; $flight->length = $length; //... 其它更多屬性 $flight->save();
此時created_at 以及 updated_at 時間戳將會被自動設置
2.2 批量賦值,create方法
返回值:Eloquent 模型實例
批量賦值就是我們不必像前面那樣一個個定義模型屬性,我們可以傳遞一個數組給模型類(這個數組通常是表單)
$flight = Flight ::create(Input::all());
這個方法有個前提條件,出於安全考慮,我們需要在model中設置黑名單(不可以被賦值的屬性 protected $guarded = ['price'])或者白名單(可以被賦值的屬性 protected $fillable = ['name']),如果不設置的話會報錯
注意:如果設置了protected $guarded = ['price']
$input = [ 'name'=>'test', 'content'=>'testflight', 'length'=>2000, // 'price'=>1880, 即使這里寫了價格,因為是 受保護的,調用下面的create,也不會插入成功 ]; $flight = Flight ::create($input); //如果想成功,那么就重新定義一下屬性,然后調用save方法 $flight ->price= 200; $flight ->save();
2.3 如果想要批量插入數據
返回值:true或者false
//$data是可以是二維數組 Flight::insert($data)
2.4 另外兩個方法
// 用屬性取回航班,當結果不存在時創建它...
返回值是Eloquent 模型實例
$flight = App\Flight::firstOrCreate(['name' => 'Flight 10']);
// 用屬性取回航班,當結果不存在時實例化一個新實例,此時尚未存入數據庫,可以使用save方法存儲
$flight = App\Flight::firstOrNew(['name' => 'Flight 10']); $flight->save(); //存入到數據庫
3 刪除模型(刪)
3.1 要刪除模型,在模型實例上調用 delete 方法:
返回值是true或者false
$flight = App\Flight::find(1); //先從是數據庫中取回數據 $flight->delete(); //實現刪除
3.2 如果你知道模型的主鍵,可以不取回模型,直接刪除
返回值是被刪除記錄數
App\Flight::destroy(1); App\Flight::destroy([1, 2, 3]); App\Flight::destroy(1, 2, 3);
3.3 通過查找來刪除
返回值是刪除條數
$deletedRows = App\Flight::where('active', 0)->delete();
4 更新模型(改)
4.1 使用save方法
返回值:true或者false
$flight = App\Flight::find(1); $flight->name = 'New Flight Name'; $flight->save();
4.2 使用update方法,同樣要用到批量賦值(黑名單和白名單也起作用)
返回值:返回更新的條數
App\Flight::where('active', 1) ->where('destination', 'San Diego') ->update(['delayed' => 1]);
5 取回模型(查)
5.1 取回多個模型
1> all方法會取回模型數據表中所有結果
$flights = Flight::all(); //我們遍歷查找每個返回的flight實例,並且輸出每個實例的name字段 foreach ($flights as $flight) { echo $flight->name; }
2> 增加額外限制,使用get方法
$flights = App\Flight::where('active', 1) ->orderBy('name', 'desc') ->take(10) ->get(); //分塊結果 Flight::chunk(200, function ($flights) { foreach ($flights as $flight) { // } });
總結:
<1>all和get等方法返回一個 Illuminate\Database\Eloquent\Collection 實例,這個實例中包含多個Eloquent 模型,Collection 類提供多種輔助函數來處理 Eloquent 結果。我們也可以簡單地像數組一樣來遍歷集合。
<2>Eloquent 模型是查詢構造器,因此你應當去閱讀所有查詢構造器中可用的方法。你可在 Eloquent 查找中使用這其中的任何方法。
5.2 取回單個模型
這些方法返回的是單個模型的實例,而不是返回模型的集合:
1> 通過主鍵取回一個模型,使用find方法
$flight = App\Flight::find(1);
2> 取回符合查找限制的第一個模型,使用first方法
$flight = App\Flight::where('active', 1)->first(); //找不到拋出異常 $model = App\Flight::findOrFail(1); $model = App\Flight::where('legs', '>', 100)->firstOrFail();
5.3 其他一些連貫操作
使用 count、sum、max,和其它查詢構造器提供的集合函數。這些方法會返回適當的標量值,而不是一個完整的模型實例:
$count = App\Flight::where('active', 1)->count(); $max = App\Flight::where('active', 1)->max('price');