Laravelのリレーションにて文字列のプライマリキーを引っ張る方法

Laravelのロゴ 備忘録

どうもmizukiです、Laravelにてリレーションをいつものように作っていたら何故か取得できずにハマりました。
プライマリキーをVARCHARに設定していおり、一部がすべて数値、一部が文字列+数値みたいな構成だったので、運良くINTにキャストされる事に気づけました。以下対処方です。

起こったエラー

プライマリキーがVARCHAR型のテーブルをbelongsToでリレーションを設定すると、一部がNULLしか返却されない。どうやらプレイマリキーは自動でINT型にキャストされるみたい。

m_shopとリレーションをしたいモデル

  public function getShop()
    {
        return $this->belongsTo('App\Models\m_shop', 'shop_id', 'shop_id');
    }

対処法

主キー
Eloquentは更にテーブルの主キーがidというカラム名であると想定しています。この規約をオーバーライドする場合は、protectedのprimaryKeyプロパティを定義してください。

さらに、Eloquentは主キーを自動増分される整数値であるとも想定しています。つまり、デフォルト状態で主キーは自動的にintへキャストされます。自動増分ではない、もしくは整数値ではない主キーを使う場合、モデルにpublicの$incrementingプロパティを用意し、falseをセットしてください。主キーが整数でない場合は、モデルのprotectedの$keyTypeプロパティへstring値を設定してください。

Eloquent:利用の開始 5.7 Laravel

App/Models/m_shop

    public $incrementing = false;
    protected $keyType = 'string';

まとめ

まさか自動でキャストされるなんて思わないからハマりそう。qiitaの記事にて「DB::getQueryLog」を知ったので次回デバッグにて利用しよう。
明日もコーディングがんばりましょう!

参考

【Laravel5.7】belongsToのリレーション先の型がintになって死んだ - Qiita
idがstring型で定義されたテーブルA、およびA.idにリレーションを張ってるテーブルBがあるとします。テーブルテーブルACREATE TABLE table_a ( `id` varchar(16) NOT N...

コメント

タイトルとURLをコピーしました