iT邦幫忙

第 11 屆 iThome 鐵人賽

DAY 10
0

昨天把資料表建好了,今天要來製作與資料表互動的「模型」。

介紹

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

ELOQUENT 模型範例

現在,讓我們來看一個 Flight 模型的範例,我們將會用它來從 flights 資料表取回與儲存資訊:

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Flight extends Model
{
    //
}

資料表名稱(Table Names)

請注意,我們並沒有告訴 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';
}

主鍵(Primary Keys)

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';
}

時間戳記(Timestamps)

Eloquent 會預設你的資料表會有 created_atupdated_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_ATUPDATED_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';
}

上一篇
DAY9 --- 資料庫: 資料填充(seeding)
下一篇
DAY11 --- Eloquent: 關聯
系列文
砍掉重練啦! 森林系男孩之後端工程師潛水App挑戰計畫27
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言