回覆列表
  • 1 # 程式設計師小助手

    引言

    前兩期為了說明laravel框架提供的資料庫操作能力,直接使用DB門面操作, 而沒有引入更為強大的eloquent orm功能。從本期開始,我們就分次把 eloquent的一些簡要知識點,為大家提煉演示一下。主要以程式碼為主,配以簡要說明。

    學習時間

    Eloquent其實是一個 ActiveRecord 型別的 ORM。這是一個位於資料庫操作之上的一箇中間層, 不僅僅是對於整張表的操作,更能細化到每行記錄的增刪改查。

    建立一個模型類非常簡單,只用繼承系統的模型就可以了:

    use Illuminate\Database\Eloquent\Model; class Contact extends Model {}

    因為遵循的是約定大於配置的慣例,所以上述模型如不指定表名,預設就是預設資料庫的contacts表了。

    對於資料庫插入新條目,則可以便捷地使用模型的方法執行,比如下面這樣:

    public function save(Request $request) {

    $contact = new Contact();

    $contact->first_name = $request->input("first_name");

    $contact->last_name = $request->input("last_name");

    $conatct->email = $request->input("email");

    $contact->save();

    return redirect("contacts");

    }

    建立一個合約,並使用傳入的表單資料填充。接著是使用模型對資料的查詢:

    public function show($contactId) { return Contact::findOrFail($contactId); }

    這裡有一個語法糖,就是 findOrFail,如果找到就返回一個模型,找不到就返回預設錯誤頁面。 上述方法會對Contact模型呼叫toArray方法進行格式化,然後返回一個 JsonResponse 物件的響應體。

    如果返回的模型想要手動定製一下,那麼在查詢結果集中,使用Collection提供的格式化功能就好了。

    public function vips() { return Contact::where("vip", true)->get()->map(function ($contact) { $contact->formalName = "The exalted {$contact->first_name} of the {$contact->last_name}s"; return $contact; }); }

    大家注意,get方法返回的是一個 Eloquent Collection,包含了Model模型的集合。所以使用map遍歷集合元素時, 每個元素其實都是一個獨立的Contact物件,直接給物件追加屬性就可以增加欄位了。

    建立模型

    除了上面我們使用手動建立模型檔案之外,laravel還為我們提供了命令列方式快捷建立。 使用下面的指令:

    php artisan make:model Contact

    這樣會在 App 名稱空間下生成一個標準的模型檔案 Contact.php,內容如下:

    namespace App; use Illuminate\Database\Eloquent\Model; class Contact extends Model { // }

    如果資料庫表還沒有建立,你想要把遷移檔案的骨架程式碼也生成出來,只需在生成指令上追加引數如下:

    php artisan make:model Contact --migration

    有些時候,我們維護一些資料庫和表,想要動態切換某個模型所對應的資料庫表, 那麼只需在模型檔案內手動指定表名即可:

    protected $table = "contacts_secondary";

    如果你使用的主鍵不是id,是自定義的欄位名,那也可以手動指定:

    protected $primaryKey = "contact_id";

    這個contact_id是系統維護,而非自增的,你需要顯式宣告不要自增這個欄位:

    public $incrementing = false;

    如果建立的表內有created_at, updated_at等等標準欄位,而在資料庫表的欄位預設值內允許為NULL,或者預設為NULL。 你想要他們自動更新為當前系統時間,只需要新增這個配置項:

    public $timestamps = false;

    儲存的日期時間格式,也可以自定義:

    protected $dateFormat = "Ymd His";

    好了,關於模型的基本屬性和常用方法,也就這些了。

    寫在最後

    本文透過演示laravel框架模型建立,以及透過演示預設配置項到自定義配置內容, 為大家展示了Model所具備的一些很讚的特性。

    Happy coding :-)

  • 中秋節和大豐收的關聯?
  • 和田玉擺件平時塗什油去保養?