Trucos y Soluciones - Programación PHP
Es posible que si usamos la opción que ofrece Prestashop de relacionar un producto principal con un accesorio, nos interese que esa relación sea bidireccional. La opción ofrece prestashop pasa por que definamos la relación de manera explicita entre Producto1 -> Producto2 para luego definir la relación Producto2 -> Producto1. Una alternativa rápida que nos ahorra la mitad del trabajo es definir todas las relaciones que nos interese en una dirección, y luego usar una consulta en SQL para completar el ciclo.
Esto en principio no entraña ninguna dificultad si tenemos acceso directo a la base de datos y tenemos cierta soltura en el manejo de bases de datos.
La tabla que define la relación entre dos productos es la llamada ps_accesory. La tabla dispone de dos campos id_product_1 e id_product_1 y define la relación Producto1 -> Producto2. Añadir todos los pares complementarios es tan sencillo como ejecutar la consulta siguiente:
INSERT INTO ps_accessory (id_product_1, id_product_2)
SELECT p1.id_product_2, p1.id_product_1 FROM ps_accessory p1
Si la ejecutamos por primera vez y no teniamos ninguna entrada previa B->A se habrá generado todos los pares que queríamos, pero esto sólo funcionará la primera vez. En las siguientes ejecuciones se encontrará con registros ya incluidos que generarán un error de clave unica como el siguiente:
Error de SQL: Duplicate entry '' for key 1
Para solucionar esto debemos complicar un poco nuestra consulta y sólo incluir aquellos pares que no se encuentren registrados ya en nuestra tabla. Para ello hacemos uso de las clausulas JOIN que nos permitiran seleccionar sólo aquellos pares que nos falten por incluir. Eso los conseguimos con la siguiente consulta:
INSERT INTO ps_accessory (id_product_1, id_product_2)
SELECT p1.id_product_2, p1.id_product_1 FROM ps_accessory p1
LEFT JOIN ps_accessory p2 ON p1.id_product_1=p2.id_product_2
AND p1.id_product_2=p2.id_product_1
WHERE p2.id_product_1 IS NULL
Esta consulta la podremos ejecutar cada vez que incluyamos nuevas relaciones entre productos y queramos completar las relaciones contrarias.
Espero que os haya resultado de utilidad.