| この記事の要点 |
|
基本: $table プロパティ
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
class Product extends Model {
// テーブル名を明示
protected $table = 'product_master';
}
// SELECT * FROM product_master が実行される
$products = Product::all();
命名規則: なぜ自動で紐づくのか
Laravel は規約優先 (Convention over Configuration)の設計です。$table を指定しない場合、クラス名から自動推測されます:
| クラス名 | 自動推測されるテーブル名 |
|---|---|
User | users |
Product | products |
OrderItem | order_items |
Category | categories (es 複数形) |
Person | people (不規則複数形) |
Datum | data (ラテン語複数) |
複数形変換は内部で Str::plural() を使い、英語の不規則変化にも対応しています。日本語ローマ字テーブル名や略語の場合は $table 明示が必要です。
$table が必要なケース
- テーブル名がクラス名と異なる(既存 DB の命名規約に合わせる場合)
- 単数形のテーブル名(
product/category等) - スキーマ付き(
schema.table_name) - プレフィックス付き(
cms_users等) - テーブル名が動詞や略語(
tx_log/m_user)
主キーのカスタマイズ
主キー名が id 以外、または auto-increment でない場合:
class Product extends Model {
protected $table = 'product_master';
// 主キーカラム名(デフォルト: 'id')
protected $primaryKey = 'product_id';
// 自動インクリメントか(デフォルト: true)
public $incrementing = false; // UUID や手動 ID の場合
// 主キーの型(デフォルト: 'int')
protected $keyType = 'string'; // UUID なら string
}
タイムスタンプ / 接続のカスタマイズ
class LegacyProduct extends Model {
protected $table = 'tbl_product';
// created_at / updated_at カラムが無いテーブル
public $timestamps = false;
// カラム名が違う場合
const CREATED_AT = 'create_datetime';
const UPDATED_AT = 'update_datetime';
// 別の DB 接続を使う場合(config/database.php で定義)
protected $connection = 'legacy_mysql';
}
fillable / guarded
テーブル紐づけと一緒に、create() / update() で受け付けるカラムを定義:
class Product extends Model {
protected $table = 'products';
// ホワイトリスト方式(推奨)
protected $fillable = ['name', 'price', 'description'];
// ブラックリスト方式(fillable と排他)
// protected $guarded = ['id', 'created_at'];
// JSON にしない / させたいカラム
protected $hidden = ['secret_token']; // toArray 時に除外
protected $visible = ['id', 'name']; // 表示するカラムを限定
// 型変換
protected $casts = [
'price' => 'decimal:2',
'options' => 'array', // JSON 列を配列に
'published_at' => 'datetime',
];
}
スキーマ付きテーブル (PostgreSQL 等)
class Product extends Model {
// schema.table 形式
protected $table = 'inventory.products';
}
// または接続ごとに schema を指定
// config/database.php
// 'pgsql' => [
// 'driver' => 'pgsql',
// 'schema' => 'inventory',
// ...
// ]
複数テーブル ⇄ 1 モデル(テーブル動的切替)
シャーディングや月別テーブル分割でテーブル名を動的に変えたい場合:
class Log extends Model {
public $timestamps = false;
public static function forMonth($yearMonth) {
$instance = new static();
$instance->setTable("logs_{$yearMonth}"); // 動的に変更
return $instance;
}
}
// 使い方
$logs = Log::forMonth('202401')->where('user_id', 1)->get();
// SELECT * FROM logs_202401 WHERE user_id = 1
動作確認
php artisan tinker
>>> \App\Models\Product::query()->toSql()
=> "select * from \"product_master\""
>>> $p = new \App\Models\Product();
>>> $p->getTable()
=> "product_master"
>>> $p->getKeyName()
=> "product_id"
関連
- マイグレーション:
Schema::create('product_master', ...)でテーブル作成時の名前を合わせる - Factory / Seeder: モデル経由なので $table の指定が自動的に効く
- リレーション:
hasMany('App\Models\Order', 'product_id')のように外部キー指定も忘れず - $with でリレーション eager load:
protected $with = ['category'];
子ページ
子ページはありません
人気ページ
- 1 Eclipseで「サーバーに追加または除去できるリソースがありません。」の原因と対処法
- 2 tomcat の起動 / 停止ログと catalina.log・catalina.out の違い
- 3 JavaScript で base URL を取得する方法|window.location.origin
- 4 YouTube Data API v3 エラー一覧|403・400・404 の原因と対処
- 5 Laravel エラー一覧|500/Blade/DB 接続/ルーティングの代表エラー
- 6 3Dグラフィックスとは|モデリング/レンダリング/主要ソフトウェア (Blender / Maya)
- 7 Spring Frameworkのアノテーション一覧
- 8 【Spring】@Valueアノテーションとは
- 9 CATALINA_HOME の確認方法 (Linux / Mac)
- 10 【Spring】@Autowiredアノテーションとは
最近更新/作成されたページ
- プロジェクトをTomcatプロジェクトとして認識させる方法 2026-10-07 22:32:50
- MySQLの1366 Incorrect string value|Laravelの文字コード・絵文字エラー 2026-10-07 21:54:03
- curlの証明書ホスト名不一致|旧エラー51・現行60の確認と対処 2026-10-07 21:54:03
- LaravelのMassAssignmentException|fillableの原因と安全な対処 2026-10-07 21:54:03
- Eclipse で Tomcat の起動ログがコンソールに出ない時の確認手順 2026-10-07 21:54:02
- MySQLにおける中央値(Median)の導き方(バージョン8未満) 2026-10-07 13:49:45
- getInputForward 2026-10-07 13:41:15
- JSONから配列に変換 2026-10-07 13:41:15
- ビューから値をモデルに格納しコントローラーで受け取る方法 2026-10-07 13:23:41
- Laravelのテーブル作成と定義変更|マイグレーション・up/down・注意点 2026-10-07 13:23:41
- NumPy 配列に要素を追加する方法 (append / concatenate) 2026-10-07 13:23:41
- MariaDB・MySQLで現在日時を取得する方法|NOW・タイムゾーン・保存型 2026-10-07 13:13:36
- 【django】テンプレートで定数を使用する方法 2026-10-07 13:10:15
- Spring BootにおけるApplication.propertiesの環境依存設定の分割方法 2026-10-07 12:09:35
- Not supported for DML operations【Springエラー】 2026-10-07 11:09:38