>  Q&A  >  본문

Laravel 문제: hasMany 관계 레코드 업데이트 문제

<p>브랜드 모델과 hasMany 관계가 있는 사용자 모델이 있는데 사용자의 브랜드를 올바르게 업데이트하는 데 문제가 있습니다. </p> <p>사용자가 텍스트 필드에 자신의 브랜드를 입력/제거/업데이트할 수 있는 양식이 있습니다. 현재 사용자가 브랜드를 입력하거나 편집한 후 사용자의 브랜드를 업데이트하기 위해 사용하고 있는 방법은 모든 기존 브랜드를 삭제하는 것입니다. 사용자와 연결된 다음 값을 반복하고, 브랜드 모델을 만든 다음 "saveMany"...하지만 추가할 때 제약 조건 충돌이 발생하는 것 같습니다...이 작업을 수행하는 더 좋은 방법이 있는지 궁금합니다. < ; <p>내 <code>사용자</code> 모델에는 다음이 있습니다.</p> <pre class="brush:php;toolbar:false;">공개 함수 브랜드() { return $this->hasMany('브랜드::class'); } </pre> <p>그런 다음 내 컨트롤러에는 브랜드를 업데이트하는 다음 코드가 있습니다.</p> <pre class="brush:php;toolbar:false;">$user->brands()->delete(); foreach ($request['brands']를 $brand로) { $brandArray[] = 새 브랜드([ '이름' => $브랜드['이름'], '등급' => $브랜드['등급'], ]); } !empty($brandArray) && $user->brands()->saveMany($brandArray); </pre> <p>더 좋은 방법이 있나요? </p>
P粉054616867P粉054616867388일 전472

모든 응답(1)나는 대답할 것이다

  • P粉702946921

    P粉7029469212023-08-31 11:27:59

    세 부분으로 나누어 보겠습니다.

    # 제약 조건 키 위반:

    다른 테이블에 외래 키 제약 조건을 추가하고 브랜드를 삭제해야 하는 경우 외래 키로 제약된 관련 데이터도 모두 삭제해야 합니다.

    #디자인

    브랜드 관련 데이터를 삭제할 수 없다면 더 나은 디자인이 있는지 고려해 볼 수도 있습니다. 사용자가 일부 데이터를 삭제할 때마다 DELETE API를 호출하는 후크를 프런트엔드에 추가할 수도 있습니다.

    # 쿼리

    브랜드에 고유한 키가 있는 경우 saveMany 대신 upsert를 사용할 수 있습니다. 이것이 더 효율적일 것입니다.

    #결론

    사용자가 브랜드를 삭제할 때마다 프런트엔드의 후크를 통해 브랜드를 삭제하는 것이 좋으며, upsert 来处理创建和更新를 사용하여 생성 및 업데이트 콘텐츠를 처리하는 것이 좋습니다

    회신하다
    0
  • 취소회신하다