Home Arrow Icon Knowledge base Arrow Icon Global Arrow Icon 동기화 된 방법이 중복 ID를 처리하는 방법은 어떻게 처리됩니까?


동기화 된 방법이 중복 ID를 처리하는 방법은 어떻게 처리됩니까?


Laravel의 'SyncwithOutDetaching'메소드는 기존 테이블을 제거하지 않고 다수의 피벗 테이블에 새로운 관계를 추가하도록 설계되었습니다. 중복 ID를 처리하는 방법과 관련하여 다음은 자세한 설명이 있습니다.

-ED 배열로 'syncwithOutDetaching'을 호출 할 때 Laravel은 해당 관계를 위해 피벗 테이블에 아직 존재하지 않는 ID 만 첨부합니다. 제공된 배열에없는 ID를 분리하는 표준`sync '메소드와 달리 기존 관계를 제거하지 않습니다 [1] [5] [6].

- 그러나`syncwithoutDetaching` 자체는 피벗 테이블이나 응용 프로그램 논리가 허용하는 경우에 본질적으로 복제를 방지하지 않습니다. 피벗 테이블에 외래 키 조합에 고유 한 제약 조건이없는 경우, 메소드가 잘못 호출되거나 데이터베이스 스키마가 허용하는 경우 중복 항목을 삽입 할 수 있습니다 [3] [7] [8].

- 복제를 피하기 위해 데이터베이스 수준에서 피벗 테이블 열 (예 : 두 개의 외국 키 열)의 고유 한 복합 키를 시행하는 것이 좋습니다. 이렇게하면 중복 행을 삽입하려는 시도가 실패하고 응용 프로그램에서 이러한 예외를 처리 할 수 ​​있습니다 [8].

- 내부적으로`syncwithOutDetaching '은`sync'메소드를`false '로 설정 한'sync '메소드를 호출하여 작동합니다. 즉, "분리하지 마십시오"를 의미합니다. 이로 인해 기존 항목을 제거하지 않고 새 항목을 추가 할 수 있습니다. 기존 ID를 확인하고 누락 된 ID 만 삽입하므로 입력 배열에 복제물이 포함되어 있지 않으면 일반적으로 작업 자체에서 복제물을 추가하지 못하게합니다 [1] [6].

- 복제물이 여전히 나타나면 종종 중 하나에 기인합니다.
- 중복 ID를 포함하는 입력 배열.
- 데이터베이스 수준 제약 조건 부족.
-`attach ()`를 사용하는 대신`att

요약하면, 'SyncwithOutDetaching'은 아직 관련이없는 ID 만 첨부하여 작동 중에 중복 관계를 추가하지 않지만 적절한 입력 및 데이터베이스 제약 조건에 의존하여 중복을 완전히 방지합니다. 피벗 테이블에 고유 한 인덱스를 추가하는 것은 중복 행이 존재할 수없는 모범 사례입니다. 복제물이 발생하면 일반적으로`첨부 '와 같은 관련 메소드의 제약이 누락되거나 부적절한 사용을 나타냅니다.

이 방법은 기존의 관계에 영향을 미치지 않고 적절한 데이터베이스 설계와 올바르게 사용될 경우 중복 항목을 위험에 빠뜨리지 않고 관계를 추가하려는 경우 특히 유용합니다.

인용 :
[1] https://stackoverflow.com/questions/17472128/preventing-laravel-adding-multiple-records-to-a-pivot-table
[2] https://laracasts.com/discuss/channels/laravel/many-to-many-sync-method-creates-duplicates-is-is-lyge-way-to-do-it
[3] https://github.com/laravel/framework/issues/21639
[4] https://laracasts.com/discuss/channels/eloquent/belongstomany-and-wanted-duplicates
[5] https://serversideup.net/managing-pivot-data-with-laravel-eloquent/
[6] https://stackoverflow.com/questions/62104188/laravel-eloquent-attach-vs-syncwithoutdetaching
[7] https://www.youtube.com/watch?v=dcrisowswti
[8] https://github.com/laravel/framework/issues/14270