3
2

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.

Eloquentモデルのクラス名から主キーを取得する

Posted at

はじめに

既存のDB構成の都合上主キー名が異なるテーブルで条件付きでID一覧をクラスごとに取ろうとしたときにいい方法に出会ったのでそのメモ

愚直な方法

クラス名指定で書くと似たような箇所も多く追加でいちいちcaseを増やさないといけなく面倒・・・


// それぞれ主キー名が異なる類似したモデル
use App\Hoge;
use App\Fuga;

function scopedIds(string $className): array
{
    switch ($className) {
        case Hoge::class:
            return Hoge::scope()->pluck('hoge_id');
        case Fuga::class:
            return Fuga::scope()->pluck('fuga_id');
    }
}

EloquentモデルのgetKeyNameでやってみる

https://laravel.com/api/6.x/Illuminate/Database/Eloquent/Model.html#method_getKeyName
EloquentモデルのメソッドとしてgetKeyNameという主キー名を取得するものがあり、これ活用するとシンプルに済む

function scopedIds(string $className): array
{
    $primaryKey = (new $className())->getKeyName();
    return $className::scope()->pluck($primaryKey);
}

終わりに

調べてみるとまだまだ便利なメソッドが提供されているので、複雑なDB構造と戦っている時にドキュメントを覗くといいやり方があったりするので、参考にできそうな感じ

3
2
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
3
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?