web-dev-qa-db-ja.com

Laravel 5.2-Eloquent Tableのカスタム主キーとして文字列を使用すると0になります

私はテーブルの主キーとして電子メールを使用しようとしているので、雄弁なコードは

<?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はこんな感じです

enter image description here

しかし、私がこれを行うと-

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になります。

誰も助けてくれますか?

51
Abrar Jahin

これは 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;
}
124
andrewtweber

モデルで$incrementingをfalseに設定します

public $incrementing = false;

これにより、自動インクリメントフィールドであると見なされなくなります。

Laravel Docs-Eloquent-モデルの定義

21
lagbox

設定する必要があるモデルには2つのプロパティがあります。最初の$primaryKeyは、主キーがオンになる列をモデルに指示します。 2番目の$incrementingは、主キーが線形の自動増分値ではないことを認識します。

class MyModel extends Model
{
    protected $primaryKey = 'my_column';

    public $incrementing = false;
}

詳細については、 EloquentのドキュメントPrimary Keysセクションを参照してください。

5
Wader

Laravel AP​​IをテストするためにPostmanを使用していました。

次のエラーを受け取りました

「SQLSTATE [42S22]:列が見つかりません:1054不明な列」は、Laravelが2つの列「created_at」と「updated_at」を自動的に作成しようとしたためです。

モデルにpublic $timestamps = false;を入力する必要がありました。その後、Postmanで再度テストし、データベースに"id" = 0変数が作成されていることを確認しました。

APIを修正するには、最後にpublic $incrementing false;を追加する必要がありました。

2
Erich Meissner

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);
1
Zμ 1