【laravel】EloquentでPKが文字列の場合、DBからの取得結果が数字にキャストされてしまう。

    

表題の通り、クエリビルダからの結果がなぜか0でかえって来てしまう現象が発生したので忘備録です。

モデルの定義

class Xxxx extends Model
{
    
  protected $table = 't_table_xxxx';
  protected $primaryKey = 'xxxx_code';

  protected $fillable = [
      'xxxx_code'
    , 'xxxx_name'
    , 'created_user'
    , 'updated_user'
  ];

}

このような場合モデルに対してgetメソッドを用いてデータを取得した際に、
主キーであるxxxx_codeの結果が全て0でかえってきました。(先頭の文字が数字で始まる場合その数字)

試しにprimaryKeyの定義を外したところ、適切な値が取得できます。
ですので、LaravelのEloquent側で変換が発生する模様です。
primaryKeyの定義を外したの場合findメソッドや更新処理にも影響を及ぼすことが予想される為採用できません。

対応策

結論から言うと、incrementingの定義でした。
incrementing(自動採番)が指定されていると上記のような挙動になるようです。
文字列が主キーなので当然incrementingは使用しません。
というわけで下記のようにします。

class Xxxx extends Model
{
    
  protected $table = 't_table_xxxx';
  protected $primaryKey = 'xxxx_code';

  public $incrementing = false;
  
  protected $fillable = [
      'xxxx_code'
    , 'xxxx_name'
    , 'created_user'
    , 'updated_user'
  ];

}

これで文字列の主キー項目を文字で取得することができます。