昨天把資料表建好了,今天要來製作與資料表互動的「模型」。
Laravel 的 Eloquent ORM 提供了漂亮、簡潔的 ActiveRecord 來和資料庫互動。每個資料庫表有一個對應的「模型」可以用來跟資料表互動。你可以透過模型查詢資料表內的資料,以及新增記錄到資料表中。
在開始之前,一定要在 config/database.php 中設定資料庫連線。
開始之前,要先建立一個 Eloquent 模型。模型通常放在 app 目錄,不過你可以放在任何可以透過composer.json 自動載入的地方。
所有的 Eloquent 模型都繼承Illuminate\Database\Eloquent\Model 。
建立模型實例的最簡單的方法是使用 Artisan 指令的 make:model:
php artisan make:model User
假設當你產生一個模型的時候,想要產生一個資料庫遷移,可以使用 --migration 或 -m 選項:
php artisan make:model User --migration
php artisan make:model User -m
現在,讓我們來看一個 Flight 模型的範例,我們將會用它來從 flights 資料表取回與儲存資訊:
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class Flight extends Model
{
//
}
請注意,我們並沒有告訴 Eloquent Flight 模型該使用哪一個資料表。依照慣例,除非明確地指定其他名稱,不然class的小寫、底線、複數形式會拿來當作資料表的表單名稱。所以,這個案例中,Eloquent 將會假設 Flight 模型儲存記錄在 flights 資料表。你可以在模型上定義一個 table 屬性,用來指定自訂的資料表:
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class Flight extends Model
{
/**
* 與模型關聯的資料表。
*
* @var string
*/
protected $table = 'my_flights';
}
Eloquent 也會假設每個資料表有一個主鍵欄位叫做 id。你可以定義一個 $primaryKey 屬性來進行自定義。
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class Flight extends Model
{
/**
* The primary key associated with the table.
*
* @var string
*/
protected $primaryKey = 'flight_id';
}
此外,Eloquent 會假設主鍵是一個遞增的整數值,這表示預設的主鍵位自動轉換成 int。如果你希望使用非遞增或非數字的主鍵,務必把模型上的 public $incrementing 屬性設定為 false。
<?php
class Flight extends Model
{
/**
* Indicates if the IDs are auto-incrementing.
*
* @var bool
*/
public $incrementing = false;
}
如果你的主鍵不是一個整數,你應該將模型上的 protected $keyType 屬性設定為 string。
<?php
class Flight extends Model
{
/**
* The "type" of the auto-incrementing ID.
*
* @var string
*/
protected $keyType = 'string';
}
Eloquent 會預設你的資料表會有 created_at 和 updated_at 欄位。如果你不希望 Eloquent 自動管理這些欄位,可以將模型上的 $timestamps 屬性設定為 false:
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class Flight extends Model
{
/**
* Indicates if the model should be timestamped.
*
* @var bool
*/
public $timestamps = false;
}
如果你需要客製化你的時間戳記格式,在你的模型內設定 $dateFormat 屬性。這個屬性決定日期如何在資料庫中被儲存,以及當模型被序列化成陣列或是 JSON 時的格式:
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class Flight extends Model
{
/**
* The storage format of the model's date columns.
*
* @var string
*/
protected $dateFormat = 'U';
}
如果你需要自訂欄位名稱,並用來儲存時間戳記,你可以在模型中設定 CREATED_AT 和 UPDATED_AT 常數:
<?php
class Flight extends Model
{
const CREATED_AT = 'creation_date';
const UPDATED_AT = 'last_update';
}
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class Flight extends Model
{
/**
* 為模型選擇連線名稱。
*
* @var string
*/
protected $connection = 'connection-name';
}