>  기사  >  PHP 프레임워크  >  사라진 Pivot 모델 ID (Laravel 함정 일기)

사라진 Pivot 모델 ID (Laravel 함정 일기)

藏色散人
藏色散人앞으로
2020-04-20 11:53:203014검색

원인

최근 회사의 백엔드 프로젝트가 업그레이드 되었는데, 이전 laravel5.6 버전에서 laravel5.8 버전으로 업그레이드 후 시스템에서 SQL 실행 오류가 많이 발생했는데 잘 돌아갔습니다. 이전 버전의 시스템에서는 오늘의 구덩이 여행이 이루어졌습니다.

추천: "laravel 튜토리얼"

프로젝트 환경

기존 시스템(linux + laravel5.6 + php7.2 + mysql5.7)

업그레이드된 새 시스템(linux +laravel5.8 + php7.2 + mysql5.7)

laravel 프레임워크 버전만 업그레이드하였고, 기타 관련 서비스 종속성은 업그레이드하지 않았습니다.

그러나 SQL 실행 오류가 다수 발생하였으며, 예외 모니터링은 다음과 같습니다.

사라진 Pivot 모델 ID (Laravel 함정 일기)

분석 과정

이 서비스에서 오류가 발생한 것은 아래 데모를 통해 시뮬레이션한 비즈니스 로직입니다.

$pivot = UserRole::firstOrCreate([
    'user_id' => 3,
    'role_id' => 3,
]);
$this->addRoleHistory($user,$pivot->id);
dd($pivot->id);

laravel5.6 버전에서는 이 코드가 문제 없이 실행되지만, 5.8 버전으로 업그레이드하면 SQL이 많이 발생합니다. 실행 오류는 다음과 같습니다.

laravel5.6:
    dd($pivot->id); //10002
laravel5.8:
    dd($pivot->id); //null

5.6에서는 저장된 데이터에서 ID를 정상적으로 알 수 있는데, 5.8에서는 왜 안되는 걸까요? 그래서 바로 laravel5.8의 릴리즈 노트를 확인해 봤습니다. 정답을 찾지 못해서 Pivot 모델이 자동 증가 ID 획득 변경을 취소했기 때문에 5.8 소스 코드를 확인하기 시작했습니다. . .

먼저 5.6과 5.8의 firstOrCreate 함수를 비교한 결과 변경 사항이 없으며 코드 로직이 올바르게 실행되었음을 확인했습니다.

사라진 Pivot 모델 ID (Laravel 함정 일기)

그런 다음 계속해서 model->save() 함수

의 코드를 읽어보면 존재하지 않는 데이터가 insertAndSetId 함수를 통해 삽입되고 기본 키 ID가 설정되어 있는 것을 발견합니다

사라진 Pivot 모델 ID (Laravel 함정 일기)

그런데 insertAndSetId 함수는 이렇게 증가합니다. 속성의 기본값은 true

사라진 Pivot 모델 ID (Laravel 함정 일기)

입니다. 이 속성이 변경되면 이 멤버 속성이 조작되지 않습니까?

그래서 바로 5.8 피벗 모델의 소스코드를 확인해 봤습니다.

사라진 Pivot 모델 ID (Laravel 함정 일기)

드디어 5.8인 것을 확인했습니다. 중간 테이블 피벗 클래스에서는 증분값이 기본적으로 false로 설정되어 있어서 데이터가 성공적으로 삽입되었습니다. , 삽입 후 기본 키 ID가 설정되지 않았습니다. 나머지 서비스가 충돌하고 정상적으로 실행되지 않습니다...

복구 계획

각 피벗 클래스에서 증분 속성 값을 true로 다시 덮어쓰세요.

class UserRole extends Pivot
{
    public $incrementing = true;
    protected $fillable = [
        'user_id',
        'role_id',
    ];
}

수리 후:

laravel5.8:
    dd($pivot->id); //10003

Postscript

그래서 laravel5.7~laravel5.8 릴리즈 노트를 다시 꼼꼼히 읽어보니 이런 변경 이유가 아직 언급되지 않아서 다시 구글에 가보니 여전히 안되네요. 이 농담의 이유를 찾지 마세요.

사라진 Pivot 모델 ID (Laravel 함정 일기)

드디어 변경으로 인한 문제가 성공적으로 복구되었으며, 후속 버전 업그레이드에서 UT 적용 범위 및 버전 호환성 변경 테스트에 여전히 더 많은 관심을 기울여야 함을 다시 한번 상기시켜 주었습니다. 다양한 차원에서 프로젝트 품질을 보장합니다.

위 내용은 사라진 Pivot 모델 ID (Laravel 함정 일기)의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 segmentfault.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제