有一个OauthClient模型,$ client-> id在Laravel 5.2中没有返回正确的值。
" lucadegasperi / oauth2-server-laravel":" ^ 5.1"用于迁移 $ table-> string(' id',40) - > primary();
然而,当在刀片模板中使用$ 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
答案 0 :(得分:15)
这是因为默认情况下,除非另有明确说明,否则主键将被转换为int
。
(int) "wISw4JmlMQCCrMupjojcuDTK3k4hwtkb" == 0
该值仍以字符串形式存在,但如果您使用$model->id
,则会使用__get()
类中定义的魔术Illuminate\Database\Eloquent\Model
方法。
我不打算反对使用id
字段作为字符串,但如果你这样做并且也希望使用$ model-> id获取字符串值,则必须将其转换为字符串在你的模型定义中。您可以使用受保护的$ casts数组。只需将以下内容添加到您的OauthClient模型中:
protected $casts = ['id' => 'string'];
这将执行技巧并将id属性转换为字符串而不是默认整数。尽管如此我还是建议不要首先使用id作为字符串。
<强>更新强>
还有一个$incrementing
属性,您可以在模型上将其设置为false
,以告诉Laravel您想要非递增或非数字主键。将它设置在您的模型上:
public $incrementing = false;
更新2:
有关此信息现已添加到官方文档中。 在Eloquent docs找主键部分:
此外,Eloquent假设主键是递增的 整数值,这意味着默认情况下主键将是 自动转换为int。如果你想使用非递增或 一个非数字主键,您必须设置公共$ incrementing 模型上的属性为false。如果您的主键不是 整数,您应该在模型上设置protected $ keyType属性 字符串。
答案 1 :(得分:7)
设置public $incrementing = false;
对我有用。