Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/laravel/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php Laravel雄辩模型id作为字符串返回错误的值_Php_Laravel_Oauth_Laravel 5_Eloquent - Fatal编程技术网

Php Laravel雄辩模型id作为字符串返回错误的值

Php Laravel雄辩模型id作为字符串返回错误的值,php,laravel,oauth,laravel-5,eloquent,Php,Laravel,Oauth,Laravel 5,Eloquent,在Laravel 5.2中,有一个OauthClient模型$client->id没有返回正确的值 “lucadegasperi/oauth2服务器laravel”:“^5.1”用于迁移中的 $table->string('id',40)->primary() 然而,当在刀片模板中使用$client->id时,我返回“0”。使用dd($client)在id属性中显示正确的值 有什么不对劲吗 dd()的模型输出 “显示创建表oauth_客户端”中的表结构 这是因为除非另有明确说明,否则默认情况下主

在Laravel 5.2中,有一个OauthClient模型$client->id没有返回正确的值

“lucadegasperi/oauth2服务器laravel”:“^5.1”用于迁移中的 $table->string('id',40)->primary()

然而,当在刀片模板中使用$client->id时,我返回“0”。使用dd($client)在id属性中显示正确的值

有什么不对劲吗

dd()的模型输出

“显示创建表oauth_客户端”中的表结构


这是因为除非另有明确说明,否则默认情况下主键被转换为
int

(int) "wISw4JmlMQCCrMupjojcuDTK3k4hwtkb" == 0
该值仍然以字符串形式存在,但如果使用
$model->id
,它将通过
照明\数据库\雄辩\模型
类中定义的magic
\u get()
方法

我不会反对使用
id
字段作为字符串,但是如果您这样做,并且还想使用$model->id获取字符串值,那么您必须在模型定义中将其转换为字符串。有一个受保护的$casts数组可用于此目的。只需将以下内容添加到OauthClient模型中:

protected $casts = ['id' => 'string'];
这将实现这个技巧,并将id属性转换为字符串而不是默认整数。尽管我建议首先不要使用id作为字符串

更新:

还有一个
$incrementing
属性,您可以在模型上将其设置为
false
,告诉Laravel您想要非递增或非数字主键。在您的模型上设置如下:

public $incrementing = false;
更新2:

有关这方面的信息现在也添加到官方文件中。 在以下位置查找主键部分:

此外,Eloquent假设主键是递增的 整数值,这意味着默认情况下主键为 自动转换为整数。如果您希望使用非递增或 非数字主键必须设置公共$incrementing 属性设置为false。如果您的主键不是 整数,则应在模型上设置受保护的$keyType属性 串


设置
public$incrementing=false为我工作


您可以发布来自
dd($client)
的输出吗?数据模型中通常没有
id
属性。通常所有属性都保存在一个属性数组中,并且有一个神奇的
\uu get
方法来获取适当的属性。我们需要看看您的
OauthClient
模型是什么样子。添加了dd()输出并创建了表syntax非常感谢。它修复了使用此库时的许多问题!
casts()
似乎不会影响
find()
的工作方式。它只作用于二传手和传接手。如果我使用上述两种解决方案(Laravel 5.6)执行
find(123)
,它将返回一个id为
123abc
的模型实例,我认为这是一个严重的安全问题,可能会被利用。这里的类型转换发生在数据库上(手动选择返回相同的错误行)。在执行
find()
时,需要告知Eloquent将ID显式转换为字符串。我在模型中找不到这样做的方法(除了可能重写
find()
)。谢谢,伙计,我应该在5小时前用谷歌搜索这个。。。。出于好奇,大家好,我们是否应该在不阅读整个Laravel核心代码的情况下就知道这一点?@sandman至少在最新的Laravel文档中,有一节解释了这一点。搜索但一般来说,作为一名程序员通常意味着要阅读大量的核心代码;)有很多项目,都有少量或过时的文档,所以除了阅读代码之外别无选择。然而,这样做是最好的学习方式,很快就会成为你的第二天性:)这是Laravel 5.4更优雅的解决方案
protected $casts = ['id' => 'string'];
public $incrementing = false;