はじめに
既存の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構造と戦っている時にドキュメントを覗くといいやり方があったりするので、参考にできそうな感じ