Laravel 문제: hasMany 관계 레코드 업데이트 문제
P粉054616867
2023-08-30 21:47:17
<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>
세 부분으로 나누어 보겠습니다.
# 제약 조건 키 위반:
다른 테이블에 외래 키 제약 조건을 추가하고 브랜드를 삭제해야 하는 경우 외래 키로 제약된 관련 데이터도 모두 삭제해야 합니다.
#디자인
브랜드 관련 데이터를 삭제할 수 없다면 더 나은 디자인이 있는지 고려해 볼 수도 있습니다. 사용자가 일부 데이터를 삭제할 때마다 DELETE API를 호출하는 후크를 프런트엔드에 추가할 수도 있습니다.
# 쿼리
브랜드에 고유한 키가 있는 경우 saveMany 대신
upsert
를 사용할 수 있습니다. 이것이 더 효율적일 것입니다.#결론
사용자가 브랜드를 삭제할 때마다 프런트엔드의 후크를 통해 브랜드를 삭제하는 것이 좋으며,
upsert
来处理创建和更新
를 사용하여생성 및 업데이트
콘텐츠를 처리하는 것이 좋습니다