1. 程式人生 > >ORM模型簡介

ORM模型簡介

artisan 傳送門 可用 func public end 自己的 對象關系 如果

ORM模型簡介

1>什麽是ORM? ORM,即 Object-Relational Mapping(對象關系映射),它的作用是在關系型數據庫和業務實體對象之間作一個映射,這樣,我們在操作具體的 業務對象時,就不需要再去和復雜的SQL語句打交道,只需簡單的操作對象的屬性和方法即可。 2>ORM 兩種最常見的實現方式是 ActiveRecord 和 DataMapper, ActiveRecord(非常流行) 中模型與數據表一一對應, DataMapper 中模型與數據表是完全分離的。 3>Eloquent ORM 使用 ActiveRecord 實現方式,每一個 Eloquent 模型類對應著數據庫中的一張表,我們通過調用模型類的相應方法實現對數據庫的增刪改查。

一.定義模型

1.1創建model模型 1>模型通常放在 app 目錄中,不過你可以將他們隨意放在任何可通過 composer.json 自動加載的地方。(我們建議在app下建立models文件夾) 2>所有的 Eloquent 模型都繼承自 Illuminate\Database\Eloquent\Model 類。 3>創建模型實例的最簡單方法是使用 make:model artisan命令 php artisan make:model Flight 4>然後將文件移動到models文件夾下,再更改下命名空間 1.2模型約定   主要是以下幾個方面:表名,主鍵,時間,日期格式,數據庫
class Flight extends Model
{
    /**
     * 與模型關聯的數據表。
     */
    protected $table = ‘my_flights‘;

/**
     * 指定主鍵。
     */
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 字段。如果你不希望讓 Eloquent 來自動維護這兩個字段,可在模型內將 $timestamps 屬性設置為 false: 4>如果你需要自定義自己的時間戳格式,可在模型內設置 $dateFormat 屬性。這個屬性決定了日期應如何在數據庫中存儲,以及當模型被序列化成數組或 JSON 時的格式: 5>默認情況下,所有的 Eloquent 模型會使用應用程序中默認的數據庫連接設置。如果你想為模型指定不同的連接,可以使用 $connection 屬性:

二.添加模型(增)

1>基本添加,save方法 返回值:true或者false
//首先創建一個新模型實例
$flight = new Flight;
//給這個模型添加屬性
$flight->name = $name;
$flight->length = $length;
//... 其它更多屬性
$flight->save();
此時created_at 以及 updated_at 時間戳將會被自動設置 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();
3>如果想要批量插入數據 返回值:true或者false
//$data是可以是二維數組
Flight::insert($data)
4>另外兩個方法 // 用屬性取回航班,當結果不存在時創建它... 返回值是Eloquent 模型實例
$flight = App\Flight::firstOrCreate([‘name‘ => ‘Flight 10‘]);
// 用屬性取回航班,當結果不存在時實例化一個新實例,此時尚未存入數據庫,可以使用save方法存儲
  $flight = App\Flight::firstOrNew([‘name‘ => ‘Flight 10‘]);
  $flight->save(); //存入到數據庫

三.刪除模型(刪)

1>要刪除模型,在模型實例上調用 delete 方法: 返回值是true或者false
$flight = App\Flight::find(1); 
  //先從是數據庫中取回數據 
  $flight->delete(); //實現刪除
2>如果你知道模型的主鍵,可以不取回模型,直接刪除 返回值是被刪除記錄數
App\Flight::destroy(1); 
  App\Flight::destroy([1, 2, 3]); 
  App\Flight::destroy(1, 2, 3);
3>通過查找來刪除 返回值是刪除條數
$deletedRows = App\Flight::where(‘active‘, 0)->delete();

四.更新模型(改)

1>使用save方法 返回值:true或者false
  $flight = App\Flight::find(1);
  $flight->name = ‘New Flight Name‘;
  $flight->save();
2>使用update方法,同樣要用到批量賦值(黑名單和白名單也起作用) 返回值:返回更新的條數
App\Flight::where(‘active‘, 1) ->where(‘destination‘, ‘San Diego‘) ->update([‘delayed‘ => 1]);
五.取回模型(查) 1>取回多個模型 每個 Eloquent 模型想像成強大的查詢構造器,它讓你可以流暢地查找與模型關聯的數據表,可以通過相對應的屬性來訪問模型的字段值。
$flights = Flight::all();

//我們遍歷查找每個返回的flight實例,並且輸出每個實例的name字段 foreach ($flights as $flight) { echo $flight->name; }
可以增加限制
$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 查找中使用這其中的任何方法。 2>取回單個模型 這些方法返回的是單個模型的實例,而不是返回模型的集合:
$flight = App\Flight::find(1); 
// 通過主鍵取回一個模型... 
$flight = App\Flight::where(‘active‘, 1)->first(); 
// 取回符合查找限制的第一個模型 ...
 $model = App\Flight::findOrFail(1); 
//找不到模型時拋出一個異常 
$model = App\Flight::where(‘legs‘, ‘>‘, 100)->firstOrFail();
3>其他一些連貫操作 使用 count、sum、max,和其它查詢構造器提供的集合函數。這些方法會返回適當的標量值,而不是一個完整的模型實例:
$count = App\Flight::where(‘active‘, 1)->count(); 
  $max = App\Flight::where(‘active‘, 1)->max(‘price‘);

關於返回值的實際操作傳送門:laravel框架之返回值

ORM模型簡介