概要
laravelではEloquentというORMが用意されています。
ORMとは「Object-Relational-Mapping」の略で、互換性のないデータを自動的に変換して、相互にデータをやり取りできるようにするための仕組みです。
Illuminate\Database\Eloquent\Model
クラス(以下:モデルクラス)で記述したPHPスクリプトはこの仕組みによって、データベースから取得したレコードはPHPのオブジェクトに変換し、データベースに値を渡す時はPHPオブジェクトをレコードへ変換して渡されます。
これがModelクラスによるデーターベースの操作です。
モデルクラスの作成
モデルクラスはartisanコマンドで作成し、指定がなければapp直下に保存されます。
ですが、個人的な好みでapp直下よりModelsファイルがあった方がしっくりくるので、Modelsファイルを作成した例を記述していきます。
コマンド
例としてSampleというモデルクラスを作成します。
php artisan make:model
というコマンドを使用します。
また、Laravelはテーブル名に基づきインデックス名を付けるため、クラス名は対象とするテーブル名と同じ名前(頭文字は大文字)にしてください。
php artisan make:model Models/Sample
ディレクトリ構造
ここでは上記のようにModelsファイルを追加した場合のディレクトリ構造を記述します。
app
├─ Models
| ├─ Sample.php
ファイルの中身
namespaceとuse元と作成したモデルクラスしか記述されていません。
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
class Sample extends Model
{
//
}
モデルクラスの基本設定
設定をしなければデフォルトのまま編集していくことができますが、デフォルトの設定を変更することもできます。
テーブルとの紐付け
Eloquentではテーブル名に基づきクラス名を付けると上記しました。
ですが、laravelでEloquentの使用を想定せずにスネークケースで命名されたテーブルも多々あります。
その場合は$table
プロパティでモデルとテーブルを紐づけることができます。
class Sample extends Model
{
/**
* モデルと関連しているテーブル
*
* @var string
*/
protected $table = 'sampl_table';
}
主キー
Eloquentではカラム名がid
のカラムが主キーと設定されています。
主キーをid
以外のカラムに設定したい場合は$primaryKey
プロパティで設定します。
class Sample extends Model
{
/**
* テーブルの主キー
*
* @var string
*/
protected $primaryKey = 'user_id';
}
```
### オートインクリメントを無効にする
Eloquentでは主キーがオートインクリメントで増加する整数値であるとデフォルトで設定されています。
そのため、オートインクリメントまたは整数値ではない値を主キーを使う場合は`$incrementing`プロパティを`false`に設定します。
```php:Model
class Flight extends Model
{
/**
* IDが自動増分されるか
*
* @var bool
*/
public $incrementing = false;
}
## タイムスタンプ
デフォルトだとデータベース上に存在する`created_at`と`updated_at`を自動的に更新します。
この更新を無効にするには`$timestamps`を`false`に設定します。
```php:Model
class Sample extends Model
{
/**
* モデルのタイムスタンプを更新するかの指示
*
* @var bool
*/
public $timestamps = false;
}
```
## データベースの接続先
Eloquentモデルはデフォルトでアプリケーションに設定されているデータベースを使用します。
設定とは異なるデータベースへ接続する場合は`$connection`プロパティで設定します。
```php:Model
class Flight extends Model
{
/**
* モデルで使用するコネクション名
*
* @var string
*/
protected $connection = 'connection-name';
}
```
## 属性の保護
`$guarded`は値を代入したくないカラムを設定するプロパティです。
モデルではNotNull以外の項目に値が揃わないと保存ができません。
ですが、idのように主キーやオートインクリメントとして設定されているカラムはデータベース側で自動でフィールドを振り分けるため、モデルで値を設定する必要はありません。
このような場合に`$guarded`で値を代入しないと設定します。
```php:Model
<?php
class Flight extends Model
{
/**
* 代入しない属性
*
* @var array
*/
protected $guarded = ['id'];
}
```