Laravel 5.2 で Eloquent テーブルの主キーとしてカスタム文字列を使用しようとすると、主キーキーの値が驚くほど 0 になる場合があります。この動作は不可解な場合があります。
問題を詳しく調べて解決策を見つけてみましょう:
文字列ベースの主キーを持つテーブルがあり、Eloquent を使用しています。データベースと対話します。主キーに基づいて first() を使用してレコードを取得すると、結果のオブジェクトでは主キーの値が 0 になります。
問題は、Laravel の auto-主キーをインクリメントします。デフォルトでは、Laravel は主キーが整数であると想定します。モデルから属性を取得するときに、対応する列を整数としてキャストする必要があるかどうかをチェックします。主キーは文字列であるため、このキャスト プロセスにより値が 0 に変更されます。
この問題を解決するには、主キーが自動インクリメントされないことを明示的に指定する必要があります。文字列として扱う必要があります。これを行うには、Eloquent モデル クラスに次の行を追加します。
protected $primaryKey = 'your_key_name'; // Your primary key name public $incrementing = false; // Disable auto-incrementing
Laravel 6.0 以降の場合:
上記に加えて、次の行も必要です。 $keyType プロパティを 'string' に設定するには:
protected $keyType = 'string';
これらの設定により、Laravel主キーを文字列として正しく扱い、整数への誤ったキャストを防ぎます。
タイムスタンプ:
テーブルがタイムスタンプがない場合は、モデル内で $timestamps を false に設定して、タイムスタンプが'0000-00-00 00:00:00'.
$timestamps = false;
例:
非自動インクリメントを備えたモデルの更新された例を次に示します。 string Primary key:
namespace App; use Illuminate\Database\Eloquent\Model; class UserVerification extends Model { protected $table = 'user_verification'; protected $fillable = ['email', 'verification_token']; //$timestamps = false; // If your table doesn't have timestamps protected $primaryKey = 'verification_token'; public $incrementing = false; protected $keyType = 'string'; // For Laravel 6.0+ }
これらの変更により、次のことができるようになります。主キーの値が 0 にリセットされることなく、Laravel 5.2 で文字列ベースの主キーを正常に操作できるようになりました。
以上がLaravel 5.2 Eloquent モデルの文字列主キーが 0 になるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。