私はテーブルの主キーとして電子メールを使用しようとしているので、雄弁なコードは
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class UserVerification extends Model
{
protected $table = 'user_verification';
protected $fillable = [
'email',
'verification_token'
];
//$timestamps = false;
protected $primaryKey = 'verification_token';
}
そして私のDBはこんな感じです
しかし、私がこれを行うと-
UserVerification::where('verification_token', $token)->first();
これを取得しています-
{
"email": "[email protected]",
"verification_token": 0,
"created_at": "2016-01-03 22:27:44",
"updated_at": "2016-01-03 22:27:44"
}
したがって、verification token/primary keyは0になります。
誰も助けてくれますか?
これは 2015年12月29日にアップグレードドキュメントに追加された であったため、以前にアップグレードした場合はおそらく見逃していました。
モデルから属性を取得するとき、その列を整数、文字列などとしてキャストする必要があるかどうかをチェックします。
デフォルトでは、自動インクリメントテーブルの場合、このメソッドではIDは整数であると想定されます。
https://github.com/laravel/framework/blob/5.2/src/Illuminate/Database/Eloquent/Model.php#L279
解決策は次のとおりです。
class UserVerification extends Model
{
protected $primaryKey = 'your_key_name'; // or null
public $incrementing = false;
}
モデルで$incrementing
をfalseに設定します
public $incrementing = false;
これにより、自動インクリメントフィールドであると見なされなくなります。
設定する必要があるモデルには2つのプロパティがあります。最初の$primaryKey
は、主キーがオンになる列をモデルに指示します。 2番目の$incrementing
は、主キーが線形の自動増分値ではないことを認識します。
class MyModel extends Model
{
protected $primaryKey = 'my_column';
public $incrementing = false;
}
詳細については、 Eloquentのドキュメント のPrimary Keys
セクションを参照してください。
Laravel APIをテストするためにPostmanを使用していました。
次のエラーを受け取りました
「SQLSTATE [42S22]:列が見つかりません:1054不明な列」は、Laravelが2つの列「created_at」と「updated_at」を自動的に作成しようとしたためです。
モデルにpublic $timestamps = false;
を入力する必要がありました。その後、Postmanで再度テストし、データベースに"id" = 0
変数が作成されていることを確認しました。
APIを修正するには、最後にpublic $incrementing false;
を追加する必要がありました。
iDを使い続けます
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class UserVerification extends Model
{
protected $table = 'user_verification';
protected $fillable = [
'id',
'email',
'verification_token'
];
//$timestamps = false;
protected $primaryKey = 'verification_token';
}
そして、電子メールを取得:
$usr = User::find($id);
$token = $usr->verification_token;
$email = UserVerification::find($token);