Laravel Eloquent ORMのちょっとした小ネタ


LaravelのEloquent ORMであまり使わないかもしれないちょっとした小ネタです。
忘れたときにマニュアルから探すのが面倒なのでここにまとめておこうと思います。

環境

  • PHP 8.1.2
  • Laravel 9.5.1

主キーを使わない場合

下記の2つを行うことで対応できます。

  • Eloquentを使う場合、主キーはidになるのでこの設定を無効
  • 上記に合わせてオートインクリメントの設定も無効
<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class Sample extends Model
{
    /**
     * The primary key for the model.
     *
     * @var string
     */
    protected $primaryKey = null;   // 無効

    /**
     * Indicates if the IDs are auto-incrementing.
     *
     * @var bool
     */
    public $incrementing = false;   // 無効
}

created_atとupdated_atを使わない場合

マニュアルに書いてある通り、$timestampsプロパティにfalseを設定すると更新は発生しないです。

https://laravel.com/docs/9.x/eloquent#timestamps
<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class Sample extends Model
{
    /**
     * Indicates if the model should be timestamped.
     *
     * @var bool
     */
    public $timestamps = false; // 無効
}

もしくは、動的に値を設定することで対応も可能です。

<?php

use App\Models\Sample;

$model = new Sample();

$model->timestamps = false;
$model->save();

created_atとupdated_atが別名の場合

モデルクラスにCREATED_AT、または、UPDATED_AT定数に別名を設定するだけです。

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class Sample extends Model
{
    /**
     * The name of the "created at" column.
     *
     * @var string|null
     */
    const CREATED_AT = 'create_date_time';

    /**
     * The name of the "updated at" column.
     *
     * @var string|null
     */
    const UPDATED_AT = 'update_date_time';
}

変更しない場合、created_atupdated_atが値として設定されています。

https://github.com/laravel/framework/blob/v9.5.1/src/Illuminate/Database/Eloquent/Model.php#L184-L196

created_atとupdated_atのどちらかを使わない場合

更新が発生しないようなテーブルの場合、updated_atは不要ですね。
その場合、UPDATED_AT定数にnullを設定すると更新されなくなります。

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Sample extends Model
{
    /**
     * The name of the "updated at" column.
     *
     * @var string|null
     */
    const UPDATED_AT = null;
}

Laravelのコードを見てもらうと良いかと思いますが、カラム名がnullの場合は何もしないようです。

https://github.com/laravel/framework/blob/v9.5.1/src/Illuminate/Database/Eloquent/Concerns/HasTimestamps.php#L50