Предотвращение добавления Laravel нескольких записей в сводную таблицу



У меня есть много-много отношений, настроенных и работающих, чтобы добавить товар в корзину, которую я использую:



$cart->items()->attach($item);


который добавляет элемент в сводную таблицу (как и должно быть), но если пользователь снова нажимает на ссылку, чтобы добавить элемент, который они уже добавили, он создает дублирующую запись в сводной таблице.



есть ли встроенный способ добавить запись в сводную таблицу, только если он уже не существует?



если нет, то как я могу проверить сводную таблицу, чтобы найти, если соответствующая запись уже существует?

699   4  

4 ответов:

вы можете проверить наличие существующей записи, написав очень простое условие вроде этого :

if (! $cart->items->contains($newItem->id)) {
    $cart->items()->save($newItem);
}

или/и вы можете добавить условие уникальности в свою базу данных, это вызовет исключение при попытке сохранения дуплета.

вы также должны взглянуть на более простой ответ от Barryvdh чуть ниже.

вы также можете использовать $model->sync(array $ids, $detaching = true) метод и отключить отсоединение (второй парам).

$cart->items()->sync([$item->id], false);

обновление: Начиная с Laravel 5.3 или 5.2.44, вы также можете вызвать syncWithoutDetaching:

$cart->items()->syncWithoutDetaching([$item->id]);

который делает точно так же, но более читаемым :)

@alexandre Butynsky метод работает очень хорошо, но использовать два sql-запросов.

один, чтобы проверить, если корзина содержит товар и один, чтобы сохранить.

чтобы использовать только один запрос используйте это:

try {
    $cart->items()->save($newItem);
}
catch(\Exception $e) {}

так же хорошо, как и все эти ответы, потому что я пробовал их все, одна вещь все еще остается без ответа или не заботится: вопрос об обновлении ранее проверенного значения (снимите флажок[es]). У меня есть что-то похожее на приведенный выше вопрос ожидайте, что я хочу проверить и снять флажок функции продуктов в моей таблице функций продукта (сводная таблица). Я новичок, и я понял, что ни один из вышеперечисленных не сделал этого. Оба хороши при добавлении новых функций, но не тогда, когда я хочу удалить существующие функции (т. е. снимите флажок)

Я буду признателен за любое просветление в этом.

$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);
}

Comments

    Ничего не найдено.