Tengo una relación de muchos a muchos configurada y en funcionamiento, para agregar un artículo al carrito que uso:
$cart->items()->attach($item);
Lo que agrega un elemento a la tabla dinámica (como debería), pero si el usuario hace clic en el enlace nuevamente para agregar un elemento que ya ha agregado, crea una entrada duplicada en la tabla dinámica.
¿Existe una forma incorporada de agregar un registro a una tabla dinámica solo si aún no existe uno?
Si no es así, ¿cómo puedo verificar la tabla dinámica para encontrar si ya existe un registro coincidente?
attach()
es mixto, puede ser un int o una instancia del modelo;) - ver github.com/laravel/framework/blob/master/src/Illuminate/…contains
Declaración de @bagusflyer comprueba si la clave está presente en un objeto de la colección. Debería haber un error en su código.$cart->items()->where('foreign_key', $foreignKey)->count()
Lo cual, bueno, en realidad también realiza una consulta adicional '^^ Pero no necesito buscar y hidratar toda la colección a menos que realmente la necesite.exists()
función en lugar decount()
para la mejor optimización.También puede usar el
$model->sync(array $ids, $detaching = true)
método y deshabilitar la separación (el segundo parámetro).Actualización: desde Laravel 5.3 o 5.2.44, también puede llamar a syncWithoutDetaching:
Que hace exactamente lo mismo, pero más legible :)
fuente
$cart->items()->sync([1, 2, 3])
construirán-muchos-a-muchos relación a la identificación de la matriz dada,1
,2
, y3
, y eliminar (o "de desconexión") todos los demás ID no está en la matriz. De esta manera, solo los identificadores dados en la matriz existirán en la tabla. Brilliant @Barryvdh usa un segundo parámetro no documentado para deshabilitar esa separación, por lo que no se eliminan las relaciones que no estén en la matriz dada, sino que solo se adjuntarán las identificaciones únicas. Consulte el documento "Sincronización para mayor comodidad". (Laravel 5.2)syncWithoutDetaching()
, que llama a sync () con falso como segundo parámetro.syncWithoutDetaching()
¡funcionó!El método @alexandre Butynsky funciona muy bien pero usa dos consultas SQL.
Uno para comprobar si el carrito contiene el artículo y otro para guardar.
Para usar solo una consulta, use esto:
fuente
Por muy buenas que sean todas estas respuestas porque las probé todas, una cosa aún queda sin respuesta o no se ha solucionado: el problema de actualizar un valor previamente marcado (desmarcó las casillas marcadas). Tengo algo similar a la pregunta anterior, espero que quiera marcar y desmarcar las características de los productos en mi tabla de características del producto (la tabla dinámica). Soy un novato y me he dado cuenta de que ninguno de los anteriores hizo eso. Ambos son buenos cuando se agregan nuevas funciones, pero no cuando quiero eliminar funciones existentes (es decir, desmarcarlo)
Apreciaré cualquier esclarecimiento en esto.
o
Lo siento chicos, no estoy seguro si debería eliminar la pregunta porque, al haber descubierto la respuesta yo mismo, suena un poco estúpido, bueno, la respuesta a lo anterior es tan simple como trabajar con @Barryvdh sync () de la siguiente manera; habiendo leído más y más sobre:
fuente
Ya se han publicado algunas respuestas excelentes. Sin embargo, también quería tirar este aquí.
Las respuestas de @AlexandreButynski y @Barryvdh son más legibles que mi sugerencia, lo que esta respuesta agrega es cierta eficiencia.
Recupera solo las entradas para la combinación actual (en realidad solo el id) y luego lo adjunta si no existe. El método de sincronización (incluso sin desconectar) recupera todos los identificadores adjuntos actualmente. Para conjuntos más pequeños con pequeñas iteraciones, esto apenas será una diferencia, ... entiendes mi punto.
De todos modos, definitivamente no es tan legible, pero funciona.
fuente