当尝试在 Laravel 5.2 中使用自定义字符串作为 Eloquent 表的主键时,主键键值可能会令人惊讶地变成 0。这种行为可能会令人费解并且令人沮丧。
让我们深入研究问题并找到解决方案:
您有一个带有基于字符串的主键的表,并且您正在使用 Eloquent与数据库交互。当您基于主键使用first()检索记录时,结果对象中的主键值变为0。
问题在于Laravel的自动默认行为递增主键。默认情况下,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;
示例:
这是具有非自动递增模型的更新示例字符串主键:
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+ }
通过这些更改,您现在应该能够在 Laravel 5.2 中成功使用基于字符串的主键,而无需将主键值重置为 0。
以上是为什么我的 Laravel 5.2 Eloquent 模型的字符串主键变成 0?的详细内容。更多信息请关注PHP中文网其他相关文章!