gpt4 book ai didi

php - Laravel Eloquent 模型 id 作为字符串返回错误值

转载 作者:可可西里 更新时间:2023-11-01 12:24:18 33 4
gpt4 key购买 nike

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

“lucadegasperi/oauth2-server-laravel”:迁移中使用了“^5.1”$table->string('id', 40)->primary();

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

有什么问题吗?

dd() 的模型输出

OauthClient {#254 ▼
#connection: null
#table: null
#primaryKey: "id"
#keyType: "int"
#perPage: 15
+incrementing: true
+timestamps: true
#attributes: array:7 [▼
"id" => "wISw4JmlMQCCrMupjojcuDTK3k4hwtkb"
"secret" => "nnw3CPTzeQSIfT4KpR0d3XzWIKKoghB3"
"name" => "http://example.com"
"package" => "free"
"user_id" => 2
"created_at" => "2016-07-19 15:36:28"
"updated_at" => "2016-07-19 15:36:28"
]
#original: array:7 [▶]
#relations: []
#hidden: []
#visible: []
#appends: []
#fillable: []
#guarded: array:1 [▼
0 => "*"
]
#dates: []
#dateFormat: null
#casts: []
#touches: []
#observables: []
#with: []
#morphClass: null
+exists: true
+wasRecentlyCreated: false
}

来自“show create table oauth_clients”的表结构

CREATE TABLE `oauth_clients` (
`id` varchar(40) COLLATE utf8_unicode_ci NOT NULL,
`secret` varchar(40) COLLATE utf8_unicode_ci NOT NULL,
`name` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
`package` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
`user_id` int(10) unsigned NOT NULL,
`created_at` timestamp NULL DEFAULT NULL,
`updated_at` timestamp NULL DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `oauth_clients_id_secret_unique` (`id`,`secret`),
KEY `oauth_clients_user_id_foreign` (`user_id`),
CONSTRAINT `oauth_clients_user_id_foreign` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci

最佳答案

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

(int) "wISw4JmlMQCCrMupjojcuDTK3k4hwtkb" == 0

该值仍然以字符串形式存在,但是如果您使用 $model->id 它将通过 Illuminate\中定义的魔法 __get() 方法Database\Eloquent\Model 类。

我不会反对将 id 字段用作字符串,但如果您这样做并且还想使用 $model->id 获取字符串值,则必须强制转换它作为模型定义中的字符串。您可以使用 protected $casts 数组。只需将以下内容添加到您的 OauthClient 模型中:

protected $casts = ['id' => 'string'];

这将起到作用,并将 id 属性转换为字符串而不是默认整数。尽管我首先建议不要将 id 用作字符串。

更新:

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

public $incrementing = false;

更新 2:

有关此的信息现在也已添加到官方文档中。在 Eloquent docs 处查找 Primary Keys 部分:

In addition, Eloquent assumes that the primary key is an incrementing integer value, which means that by default the primary key will be cast to an int automatically. If you wish to use a non-incrementing or a non-numeric primary key you must set the public $incrementing property on your model to false. If your primary key is not an integer, you should set the protected $keyType property on your model to string.

关于php - Laravel Eloquent 模型 id 作为字符串返回错误值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38463624/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com