source

Larabel이 피벗 테이블에 여러 레코드를 추가하지 않음

manysource 2022. 11. 24. 21:41

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