2016-07-19 72 views
2

有OauthClient模型,$ client-> id在Laravel 5.2中不返回正確的值。Laravel雄辯模型id作爲字符串返回錯誤值

「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 
} 

表結構「顯示創建表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

您可以發佈從'DD($客戶端)' –

+0

輸出這不是典型的數據模型有'id'屬性在那裏。通常所有屬性都保存在一個屬性數組中,並且有一個魔術'__get'方法可以獲得適當的屬性。我們需要看看你的'OauthClient'模型是怎樣的。 – apokryfos

+0

添加dd()輸出並創建表語法 –

回答

8

這是因爲通過默認主鍵澆鑄爲int除非另有明確說明。

(int) "wISw4JmlMQCCrMupjojcuDTK3k4hwtkb" == 0 

的價值仍然存在的字符串,但如果使用$model->id它會經過在Illuminate\Database\Eloquent\Model類中定義的魔法__get()方法。

我不會反對使用id字段作爲字符串,但如果你這樣做,也希望得到使用$模型 - > ID字符串值,你必須強制轉換爲字符串,在你的模型定義。有一個受保護的$ casts數組可用於此目的。只需添加以下到您的OauthClient型號:

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

這將這樣的伎倆,並蒙上了id屬性作爲字符串而不是默認的整數。儘管我會建議不要首先使用id作爲字符串。

更新:

還有一個$incrementing屬性,該屬性可以設置爲false您的模型,告訴Laravel你想不增加或者非數字的主鍵。將其設置在您的模型上,如下所示:

public $incrementing = false; 
+0

非常感謝。它在使用這個庫時修復了很多問題! –