Laravel 5.2-Eloquent 테이블에 대한 사용자 지정 기본 키로 문자열 사용이 0이 됨


84

이메일을 내 테이블의 기본 키로 사용하려고하므로 내 설득력있는 코드는-

<?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": "sdfsdf@sdfsdf.sdf",
  "verification_token": 0,
  "created_at": "2016-01-03 22:27:44",
  "updated_at": "2016-01-03 22:27:44"
}

따라서 인증 토큰 / 기본 키 는 0이됩니다.

누구든지 도와 주시겠습니까?

답변:


184

이것은 2015 년 12 월 29 일에 업그레이드 문서에 추가 되었으므로 이전에 업그레이드했다면 놓쳤을 것입니다.

모델에서 속성을 가져올 때 해당 열을 정수, 문자열 등으로 캐스팅해야하는지 확인합니다.

기본적으로 자동 증가 테이블의 경우이 방법에서 ID는 정수로 간주됩니다.

https://github.com/laravel/framework/blob/5.2/src/Illuminate/Database/Eloquent/Model.php#L2790

따라서 해결책은 다음과 같습니다.

class UserVerification extends Model
{
    protected $primaryKey = 'your_key_name'; // or null

    public $incrementing = false;

    // In Laravel 6.0+ make sure to also set $keyType
    protected $keyType = 'string';
}

3
$incrementing필드가 보호되지 않고 공개 되는 이유 가 있습니까?
Mubashar Abbas

5
@MubasharAbbas 글쎄, 당신의 모델은 Eloquent와 일치해야합니다. 이제 Eloquent는 왜 $incrementing공개되고 $primaryKey보호됩니까? 꽤 임의적입니다. 내가 추측하고있어 $incrementing설득력 이전 버전의 게터 또는 setter 메소드 (지금 수행을)하지 않았고 그들은 단지 그들을 추가 한 후 주요 변경을 만들고 싶어하지 않았다
andrewtweber

1
기본 키 (또는 Eloquent에서 지원하지 않는 복합 키)가없고를 사용하여 이러한 테이블을 반복하려는 chunk경우 다음 오류가 발생할 수 있습니다 SQLSTATE[42S22]: Column not found: 1054 Unknown column 'example.' in 'order clause'.. 이 경우 orderByEloquent가 기본 키를 사용하여 쿼리에 연결하려고 하는 문 을 명시 적으로 정의해야합니다 .
antongorodezkiy

이것이 라 라벨이하는 일들이 내가 온 마음을 다해 사랑하지 못하게하는 일이라는 것이 슬프다. 다른 많은 열에서와 같이 열 유형을 감지하는 것이 더 의미가 없습니까?
Miss Amelia Sara


7

설정해야하는 모델에는 두 가지 속성이 있습니다. 첫 번째 $primaryKey는 모델에 기본 키가 필요한 열을 알려줍니다. 두 번째 $incrementing는 기본 키가 선형 자동 증가 값이 아님을 알 수 있도록합니다.

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

    public $incrementing = false;
}

자세한 내용 은 Eloquent 문서Primary Keys섹션을 참조하십시오 .


1
public $incrementing부모 클래스와 일치 해야합니다 .
andrewtweber

2

Postman을 사용하여 Laravel API를 테스트했습니다.

다음과 같은 오류를 받았습니다.

"SQLSTATE [42S22] : 열을 찾을 수 없음 : 1054 알 수없는 열"Laravel이 두 개의 열 "created_at"및 "updated_at"를 자동으로 생성하려고했기 때문입니다.

나는 public $timestamps = false;내 모델 에 들어가야 했다. 그런 다음 Postman으로 다시 테스트 "id" = 0하고 데이터베이스에 변수가 생성되는 것을 확인했습니다 .

마침내 public $incrementing false;API를 수정하기 위해 추가 해야했습니다.


2

아이디를 계속 사용


<?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);
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.