Larabel이 피벗 테이블에 여러 레코드를 추가하지 않음
사용하는 장바구니에 아이템을 추가하기 위해 다수의 관계가 설정되어 있습니다.
$cart->items()->attach($item);
이렇게 하면 피벗 테이블에 항목이 추가되지만 사용자가 링크를 다시 클릭하여 이미 추가한 항목을 추가하면 피벗 테이블에 중복 항목이 생성됩니다.
레코드가 아직 존재하지 않는 경우에만 레코드를 피벗 테이블에 추가할 수 있는 빌트인 방법이 있습니까?
일치하지 않는 경우 일치하는 레코드가 이미 있는지 확인하기 위해 피벗 테이블을 확인하려면 어떻게 해야 합니까?
를 사용할 수도 있습니다.$model->sync(array $ids, $detaching = true)
method 및 disabled detaching(두 번째 파라미터)을 지정합니다.
$cart->items()->sync([$item->id], false);
업데이트: Larabel 5.3 또는 5.2.44 이후부터 syncWithoutDetaching을 호출할 수도 있습니다.
$cart->items()->syncWithoutDetaching([$item->id]);
같은 기능을 하고 있습니다만, 가독성이 향상되었습니다.
다음과 같은 매우 간단한 조건을 작성하여 기존 레코드의 존재를 확인할 수 있습니다.
if (! $cart->items->contains($newItem->id)) {
$cart->items()->save($newItem);
}
또는 데이터베이스에 유니시티 조건을 추가할 수 있습니다.더블렛을 저장하려고 하면 예외가 발생합니다.
또한 Barryvdh의 보다 솔직한 답변도 살펴봐야 합니다.
@alexandre Butynsky 메서드는 매우 잘 작동하지만 2개의 SQL 쿼리를 사용합니다.
하나는 카트에 항목이 포함되어 있는지 확인하는 것이고 하나는 저장할 것입니다.
쿼리를 하나만 사용하려면 다음을 사용합니다.
try {
$cart->items()->save($newItem);
}
catch(\Exception $e) {}
이 모든 답변은 모두 시도해 봤기 때문에 좋은 것이지만, 한 가지는 아직 답변이 없거나 처리되지 않은 채로 남아 있습니다. 바로 이전에 체크한 값을 갱신하는 문제(체크박스가 꺼진 경우)입니다.제품 피처 테이블(피벗 테이블)에서 제품의 기능을 체크 및 오프하고 싶은 것은 위와 같은 질문입니다.나는 신참이고 위의 어느 것도 그것을 하지 않았다는 것을 깨달았다.새로운 기능을 추가할 때는 둘 다 좋지만 기존 기능을 삭제할 때는 적합하지 않습니다(선택 해제).
이것에 대해 어떤 계몽이라도 해주면 고맙겠다.
$features = $request->get('features');
if (isset($features) && Count($features)>0){
foreach ($features as $feature_id){
$feature = Feature::whereId($feature_id)->first();
$product->updateFeatures($feature);
}
}
//product.php (extract)
public function updateFeatures($feature) {
return $this->features()->sync($feature, false);
}
또는
public function updateFeatures($feature) {
if (! $this->features->contains($features))
return $this->features()->attach($feature);
}
//where my attach() is:
public function addFeatures($feature) {
return $this->features()->attach($feature);
}
죄송합니다, 여러분, 제가 질문을 삭제해야 하는지 잘 모르겠습니다.왜냐하면, 스스로 답을 알아냈기 때문입니다.상기의 답은 다음과 같이 @Barryvdh sync()를 실행하는 것만큼이나 간단합니다.자세한 것은, 다음과 같습니다.
$features = $request->get('features');
if (isset($features) && Count($features)>0){
$product->features()->sync($features);
}
벌써 좋은 답변들이 올라오고 있어요.이것도 여기다가 던지고 싶었는데.
@AlexandreButynski와 @Barryvdh의 답변은 제 제안보다 읽기 쉬우며, 이 답변이 더 효과적입니다.
현재 조합의 엔트리(실제로는 id만)만 취득하고 존재하지 않는 경우 부가하는 것보다 취득합니다.동기 방식(해체하지 않아도)은 현재 접속되어 있는ID 를 모두 취득합니다.반복 횟수가 적은 작은 세트라면 별 차이가 없을 겁니다. 제 말뜻을 아시겠죠.
어쨌든, 확실히 읽기 쉽지는 않지만, 효과가 있습니다.
if (is_null($book->authors()->find($author->getKey(), [$author->getQualifiedKeyName()])))
$book->authors()->attach($author);
언급URL : https://stackoverflow.com/questions/17472128/preventing-laravel-adding-multiple-records-to-a-pivot-table
'source' 카테고리의 다른 글
Google 지도에서 위도와 경도에서 주소 위치를 얻는 방법 (0) | 2022.11.24 |
---|---|
플랫폼에 의존하는 새로운 행 문자를 얻으려면 어떻게 해야 하나요? (0) | 2022.11.24 |
Java 프로세스를 정상적으로 정지하는 방법 (0) | 2022.11.24 |
python의 현재 시간에 시간을 추가하는 방법 (0) | 2022.11.24 |
jQuery를 사용하여 목록을 알파벳 순으로 정렬하려면 어떻게 해야 합니까? (0) | 2022.11.24 |