php - saber - validar si existe un registro en laravel
Evitar que Laravel agregue múltiples registros a una tabla dinámica (4)
Tengo una relación de muchos a muchos establecida y en funcionamiento, para agregar un artículo al carro que uso:
$cart->items()->attach($item);
Lo cual agrega un elemento a la tabla dinámica (como debería), pero si el usuario vuelve a hacer clic en el enlace para agregar un elemento que ya ha agregado, crea una entrada duplicada en la tabla dinámica.
¿Existe una forma integrada de agregar un registro a una tabla dinámica solo si aún no existe?
Si no, ¿cómo puedo verificar la tabla dinámica para ver si ya existe un registro coincidente?
El método @alexandre Butynsky funciona muy bien pero usa dos consultas SQL.
Uno para verificar si el carrito contiene el artículo y uno para guardar.
Para usar solo una consulta, usa esto:
try {
$cart->items()->save($newItem);
}
catch(/Exception $e) {}
Puede verificar la presencia de un registro existente escribiendo una condición muy simple como esta:
if (! $cart->items->contains($newItem->id)) {
$cart->items()->save($newItem);
}
O bien, y puede agregar condición de unidad en su base de datos, arrojaría una excepción durante un intento de guardar un doblete.
También debería echar un vistazo a la respuesta más directa de Barryvdh justo debajo.
También puede usar el método $model->sync(array $ids, $detaching = true)
e inhabilitar la separación (el segundo param).
$cart->items()->sync([$item->id], false);
Actualización: desde Laravel 5.3 o 5.2.44, también puede llamar a syncWithoutDetaching:
$cart->items()->syncWithoutDetaching([$item->id]);
Que hace exactamente lo mismo, pero más legible :)
Tan bueno como todas estas respuestas son porque las he probado todas, una cosa aún no se resuelve o no se soluciona: la cuestión de actualizar un valor previamente comprobado (desmarcó el recuadro marcado [es]). Tengo algo similar a la pregunta anterior, espero que quiera verificar y desmarcar las características de los productos en mi tabla de características de productos (la tabla dinámica). Soy un novato y me he dado cuenta de que ninguno de los anteriores hizo eso. Ambos son buenos cuando agrego nuevas características, pero no cuando quiero eliminar las características existentes (es decir, desmarcarlo)
Apreciaré cualquier aclaración en esto.
$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);
}
o
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);
}
Lo siento muchachos, no estoy seguro de que deba eliminar la pregunta porque al haber averiguado la respuesta yo mismo, suena un poco estúpido, así la respuesta a lo anterior es tan simple como trabajar @Barryvdh sync () de la siguiente manera; habiendo leído más y más sobre:
$features = $request->get(''features'');
if (isset($features) && Count($features)>0){
$product->features()->sync($features);
}