원인
최근 회사의 백엔드 프로젝트가 업그레이드 되었는데, 이전 laravel5.6 버전에서 laravel5.8 버전으로 업그레이드 후 시스템에서 SQL 실행 오류가 많이 발생했는데 잘 돌아갔습니다. 이전 버전의 시스템에서는 오늘의 구덩이 여행이 이루어졌습니다.
추천: "laravel 튜토리얼"
프로젝트 환경
기존 시스템(linux + laravel5.6 + php7.2 + mysql5.7)
업그레이드된 새 시스템(linux +laravel5.8 + php7.2 + mysql5.7)
laravel 프레임워크 버전만 업그레이드하였고, 기타 관련 서비스 종속성은 업그레이드하지 않았습니다.
그러나 SQL 실행 오류가 다수 발생하였으며, 예외 모니터링은 다음과 같습니다.
분석 과정
이 서비스에서 오류가 발생한 것은 아래 데모를 통해 시뮬레이션한 비즈니스 로직입니다.
$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 함수를 비교한 결과 변경 사항이 없으며 코드 로직이 올바르게 실행되었음을 확인했습니다.
그런 다음 계속해서 model->save() 함수
의 코드를 읽어보면 존재하지 않는 데이터가 insertAndSetId 함수를 통해 삽입되고 기본 키 ID가 설정되어 있는 것을 발견합니다
그런데 insertAndSetId 함수는 이렇게 증가합니다. 속성의 기본값은 true
입니다. 이 속성이 변경되면 이 멤버 속성이 조작되지 않습니까?
그래서 바로 5.8 피벗 모델의 소스코드를 확인해 봤습니다.
드디어 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 릴리즈 노트를 다시 꼼꼼히 읽어보니 이런 변경 이유가 아직 언급되지 않아서 다시 구글에 가보니 여전히 안되네요. 이 농담의 이유를 찾지 마세요.
드디어 변경으로 인한 문제가 성공적으로 복구되었으며, 후속 버전 업그레이드에서 UT 적용 범위 및 버전 호환성 변경 테스트에 여전히 더 많은 관심을 기울여야 함을 다시 한번 상기시켜 주었습니다. 다양한 차원에서 프로젝트 품질을 보장합니다.
위 내용은 사라진 Pivot 모델 ID (Laravel 함정 일기)의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!