Apabila cuba menggunakan rentetan tersuai sebagai kunci utama untuk jadual Eloquent dalam Laravel 5.2, yang utama nilai kunci mungkin secara mengejutkan bertukar kepada 0. Tingkah laku ini boleh membingungkan dan mengecewakan.
Mari kita mendalami masalah ini dan cari penyelesaian:
Anda mempunyai jadual dengan kunci utama berasaskan rentetan dan anda menggunakan Eloquent untuk berinteraksi dengan pangkalan data. Apabila anda mendapatkan semula rekod menggunakan first() berdasarkan kunci utama, nilai kunci primer menjadi 0 dalam objek yang terhasil.
Isunya terletak pada tingkah laku lalai Laravel untuk auto- menambah kunci utama. Secara lalai, Laravel menganggap kunci utama sebagai integer. Apabila mendapatkan semula atribut daripada model, ia menyemak sama ada lajur yang sepadan harus dibuang sebagai integer. Memandangkan kunci utama anda ialah rentetan, proses penghantaran ini menukar nilai kepada 0.
Untuk menyelesaikan isu ini, anda perlu menyatakan secara eksplisit bahawa kunci utama anda bukan auto-increment dan harus dianggap sebagai rentetan. Untuk melakukan ini, tambahkan baris berikut pada kelas model Eloquent anda:
protected $primaryKey = 'your_key_name'; // Your primary key name public $incrementing = false; // Disable auto-incrementing
Untuk Laravel 6.0 dan ke atas:
Selain perkara di atas, anda juga perlu untuk menetapkan sifat $keyType kepada 'rentetan':
protected $keyType = 'string';
Dengan tetapan ini, Laravel akan merawat anda dengan betul kunci utama sebagai rentetan dan menghalang penghantaran yang salah kepada integer.
Cap Masa:
Jika jadual anda tidak mempunyai cap masa, anda harus menetapkan $timestamps kepada false dalam model anda untuk mengelakkan masalah dengan cap masa ditetapkan kepada '0000-00-00 00:00:00'.
$timestamps = false;
Contoh:
Berikut ialah contoh model yang dikemas kini dengan bukan penambahan automatik kunci utama rentetan:
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+ }
Dengan perubahan ini, anda kini boleh berjaya bekerja dengan kunci utama berasaskan rentetan dalam Laravel 5.2 tanpa nilai kunci utama ditetapkan semula kepada 0.
Atas ialah kandungan terperinci Mengapa Kunci Utama Laravel 5.2 Model Eloquent Saya Menjadi 0?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!