setdisplayfield sentencias cake php sql mysql cakephp union

sentencias - Sintaxis de UNION en Cakephp



sentencias sql en cakephp (3)

¿Alguien sabe una buena forma de hacer una consulta UNION en CakePHP? Me gustaría evitar usar $this->query(); .

Con dos tablas t1, t2:

SELECT * FROM t1 LEFT JOIN t2 ON t1.id = t2.id UNION SELECT * FROM t1 RIGHT JOIN t2 ON t1.id = t2.id

Con tres tablas t1, t2, t3:

SELECT * FROM t1 LEFT JOIN t2 ON t1.id = t2.id LEFT JOIN t3 ON t2.id = t3.id UNION SELECT * FROM t1 RIGHT JOIN t2 ON t1.id = t2.id LEFT JOIN t3 ON t2.id = t3.id UNION SELECT * FROM t1 RIGHT JOIN t2 ON t1.id = t2.id RIGHT JOIN t3 ON t2.id = t3.id


Use una vista, luego seleccione de eso:

create view my_union as SELECT * FROM t1 LEFT JOIN t2 ON t1.id = t2.id LEFT JOIN t3 ON t2.id = t3.id UNION SELECT * FROM t1 RIGHT JOIN t2 ON t1.id = t2.id LEFT JOIN t3 ON t2.id = t3.id UNION SELECT * FROM t1 RIGHT JOIN t2 ON t1.id = t2.id RIGHT JOIN t3 ON t2.id = t3.id

En tu código:

select * from my_union


Demasiados codificadores intentan limitarse a la funcionalidad de un marco. NO. Use lo que proporciona el marco. Si no tiene la funcionalidad que busca, entonces:

  • Codifique la funcionalidad que necesita en una extensión de clase

o

  • Personalice el código dentro del marco para adaptarlo a sus necesidades.

A menudo, los desarrolladores intentan clavar una clavija cuadrada en un agujero redondo y terminan haciendo demasiado trabajo extra que realmente solo complica el código. Da un paso atrás y pregunta por qué estás usando el marco para empezar. Trae la estructura a un lenguaje no estructurado. Proporciona una base reutilizable sólida para construir su aplicación. No pretende ser una caja para ponerse y ser limitado.

ACTUALIZACIÓN: Me tomé un minuto para leer las Condiciones de búsqueda complejas y encontré tu respuesta:

$joins = array( array( ''table'' => ''test_twos'', ''alias'' => ''TestTwo'', ''type'' => ''LEFT'', ''conditions'' => array( ''TestTwo.id = TestOne.id'', ) ), array( ''table'' => ''test_threes'', ''alias'' => ''TestThree'', ''type'' => ''LEFT'', ''conditions'' => array( ''TestThree.id = TestOne.id'', ) ) ); $dbo = $this->getDataSource(); $subQuery = $dbo->buildStatement( array( ''fields'' => array(''*''), ''table'' => $dbo->fullTableName($this), ''alias'' => ''TestOne'', ''limit'' => null, ''offset'' => null, ''joins'' => $joins, ''conditions'' => null, ''order'' => null, ''group'' => null ), $this->TestOne ); $query = $subQuery; $query .= '' UNION ''; $joins = array( array( ''table'' => ''test_twos'', ''alias'' => ''TestTwo'', ''type'' => ''LEFT'', ''conditions'' => array( ''TestTwo.id = TestOne.id'', ) ), array( ''table'' => ''test_threes'', ''alias'' => ''TestThree'', ''type'' => ''RIGHT'', ''conditions'' => array( ''TestThree.id = TestOne.id'', ) ) ); $dbo = $this->getDataSource(); $subQuery = $dbo->buildStatement( array( ''fields'' => array(''*''), ''table'' => $dbo->fullTableName($this), ''alias'' => ''TestOne'', ''limit'' => null, ''offset'' => null, ''joins'' => $joins, ''conditions'' => null, ''order'' => null, ''group'' => null ), $this->TestOne ); $query .= $subQuery; pr($query);


Una forma sencilla de hacerlo, que actualmente usamos, es crear una vista en MySQL o en cualquier base de datos que use. Luego, en lugar de usar una tabla en su modelo, usa su vista. Puede leer sobre la sintaxis de creación de vista aquí: http://dev.mysql.com/doc/refman/5.6/en/create-view.html . También puede usar software como HeidiSQL para ayudarlo con la creación de vistas.

Entonces, tendrías algo como esto en tu modelo:

class Contenu extends AppModel { public $useTable = ''v_contenu'';

Esto le permite seguir usando el método find() en CakePHP, lo cual es realmente agradable de tener.

Para obtener el mejor rendimiento con vistas, debe actualizar MySQL al menos a la versión 5.6.