ホームページ  >  記事  >  データベース  >  Laravel 5.2 Eloquent モデルの文字列主キーが 0 になるのはなぜですか?

Laravel 5.2 Eloquent モデルの文字列主キーが 0 になるのはなぜですか?

Susan Sarandon
Susan Sarandonオリジナル
2024-11-22 02:25:15416ブラウズ

Why Does My Laravel 5.2 Eloquent Model's String Primary Key Become 0?

Laravel 5.2: 文字列使用時の主キー損失の解決

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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。