首页 > 数据库 > mysql教程 > 为什么我的 Laravel 5.2 Eloquent 模型的字符串主键变成 0?

为什么我的 Laravel 5.2 Eloquent 模型的字符串主键变成 0?

Susan Sarandon
发布: 2024-11-22 02:25:15
原创
493 人浏览过

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的自动默认行为递增主键。默认情况下,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中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板