11
9

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

【laravel】Eloquentの基本

Last updated at Posted at 2020-05-15

概要

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元と作成したモデルクラスしか記述されていません。

Sample.php
<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class Sample extends Model
{
  //
}

モデルクラスの基本設定

設定をしなければデフォルトのまま編集していくことができますが、デフォルトの設定を変更することもできます。

テーブルとの紐付け

Eloquentではテーブル名に基づきクラス名を付けると上記しました。
ですが、laravelでEloquentの使用を想定せずにスネークケースで命名されたテーブルも多々あります。
その場合は$tableプロパティでモデルとテーブルを紐づけることができます。

Model
class Sample extends Model
{
  /**
   * モデルと関連しているテーブル
   *
   * @var string
   */
  protected $table = 'sampl_table';
}

主キー

Eloquentではカラム名がidのカラムが主キーと設定されています。
主キーをid以外のカラムに設定したい場合は$primaryKeyプロパティで設定します。

Model
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'];
}
```
11
9
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
11
9

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?