Contents

Laravel Model 命名慣例

命名常常是令人最頭痛的環節,一個專案中沒有統一的命名規則,可能會造成開發上的疑惑,

本文參考官方文件,簡單整理了在 Laravel 中幾個命名慣例的規則


命名的方式

  • camelCase 小駝鋒式命名
  • snake_case 蛇行命名
  • PascalCase (pascal 是一門程式語言) 或稱 大駝鋒式命名

約定優於配置(Convention over configuration)

定義

約定優於配置(CoC),或稱「慣例優於設定」

是一種軟體設計範式,旨在減少軟體開發人員需做決定的數量,獲得簡單的好處,而又不失靈活性

開發者只需設定偏離約定的項目

例如,當 Model 名為 Sale 時,則對應的資料表默認(約定)為 sales

也就是 Model 的 $table 屬性預設為 sales

只有在偏離這一約定時,例如將資料表命名為 “products_sold”,才需覆寫 Model 的 $table 屬性 為 “products_sold”

1
2
3
4
5
6
7
8
<?php

// Sale Model
class Sale extends Model
{
    // 預設值為 sales,覆寫為 products_sold
    protected $table="products_sold"
}

而這樣只需對偏離約定的項目進行設定的概念就是所謂的 約定優於配置


Laravel Mdel / table / Seeder 命名慣例

下表第一列是命名對象,第二列紅字列代表命名規則,再往下則是範例

Model table Seeder、Factory
PascalCase單數 snake_case複數 PascalCase單數'Seeder/Factory'為結尾
Post posts PostSeeder / PostFactory
Mybook my_books MybookSeeder / MybookFactory

Laravel 底層取得默認 $table 值的邏輯可在 Illuminate\Database\Eloquent\ModelgetTable() 找到

若沒有設定 $table 屬性,它會利用 Illuminate\Support\Pluralizer 來取得複數的名詞

這個 Pluralizer 可能比我們預想的都要來的強大,包含以 y 結尾的單字、常見的不可數名詞都能順利轉換

如:Person => people, Category => categories, Series => series, Information => information…

不管如何,為保守起見,還是可以設定一下 $table 屬性

1
2
3
4
5
6
7
8
<?php

// Category Model
class Category extends Model
{
    // 雖然預設應該就會是 categories,但還是可以習慣設定一下
    protected $table="categories"
}

Pivot table 的命名

設兩資料表 productsfeatures 是透過一個 pivot (中介資料表) 來進行多對多的關聯

則該 pivot 的默認名稱為 feature_product,命名的規則是:依字母排序的單數名詞、snake_case

若希望 pivot 命名為 product_feature_maps,則需在兩個對應的 Model 中設定如下 (加入第二個參數,pivot name)

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
<?php

// in Product model
public function features()
{
    return $this->belongsToMany('App\Feature', 'product_feature_maps');
}

// in Feature model
public function products()
{
    return $this->belongsToMany('App\Product', 'product_feature_maps');
}

個人覺得 product_feature_maps 這樣的命名可以讓語意更加明顯

不過官方預設命名為 feature_product 也不是沒有道理

因為當大部份資料表都依慣例被取名為複數的時候,單數命名的資料表應該就是 pivot table 了


Primary/Foreign Key

命名方式 範例
Primary key 一律命名為 id id
Foreign key 來源資料表單數名詞 + _id post_id

結論:

保守為避免出錯可以都設定一下 Model 的 $table 屬性、belongsToMany 的第二參數

當然命名規則最好能盡量符合官方文件的慣例,至少要統一一個規範


參考資料: