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.