I am adapting a query to cakephp 3, the original query, it works returns one or more marriages or nothing if there is no concidence
Original Query:
select
if(a1.id != 151, p1.id, p2.id) as id,
if(a1.id != 151, p1.nombre, p2.nombre) as nombre,
if(a1.id != 151, p1.genero, p2.genero) as genero,
if(a1.id != 151, p1.imagen_id, a2.imagen_id) as imagen,
if(a1.id != 151, p1.primer_apellido, ,p2.primer_apellido) as primer_apellido,
if(a1.id != 151, p1.segundo_apellido, p2.segundo_apellido) as segundo_apellido,
ifnull(date_format(m.fecha, '%d/%m/%Y'), 'no consta fecha') as fecha_matrimonio
from matrimonios m, Personas p1, Personas p2
where a1.id = m.idhombre
and a2.id = m.idmujer
and (m.idhombre = 151 or m.idmujer = 151 )
order by fecha
He tried to adapt the query with Cakephp’s ORM:
$conyuges = TableRegistry::get('Personas')->find('all', [ 'contain' => ['Matrimonios']])
->join(['Imagenes' => [
'table' => 'imagenes',
'type' => 'LEFT',
'conditions' => 'Imagenes.id = imagen_id'
]
])
->join(['Personas2' => [
'table' => 'personas',
'type' => 'LEFT',
'conditions' => 'Personas2.id = Personas.id'
]
])
->join(['Matrimonios' => [
'table' => 'matrimonios',
'type' => 'LEFT',
/*'conditions' => 'MatrimoniosH.idhombre = '.$id*/
]
])
->select([
'id' => 'if(Personas.id != '.$id.', Personas.id, Personas2.id)',
'nombre' => 'if(Personas.id != '.$id.', Personas.nombre, Personas2.nombre)',
'genero' => 'if(Personas.id != '.$id.', Personas.genero, Personas2.genero)',
'foto' => 'if(Personas.id != '.$id.', Personas.imagen_id, Personas2.imagen_id)',
'primer_apellido' => 'if(Personas.id != '.$id.', Personas.primer_apellido, Personas2.primer_apellido)',
'segundo_apellido' => 'if(Personas.id != '.$id.', Personas.segundo_apellido, Personas2.segundo_apellido)',
'fecha_matrimonio' => 'if(Matrimonios.fecha is null, Matrimonios.fecha, "no consta fecha")'
])
->where([
'Personas.id' => 'Matrimonios.idhombre',
'Personas2.id' => 'Matrimonios.idmujer',
'(Matrimonios.idhombre = '.$id.' or Matrimonios.idmujer = '.$id.')'])
->orderAsc('fecha_matrimonio');
And it returns me:
SELECT
Personas.id AS Personas__id,
Personas.orden AS Personas__orden,
Personas.nombre AS Personas__nombre,
Personas.primer_apellido AS Personas__primer_apellido, Personas.segundo_apellido AS Personas__segundo_apellido,
Personas.poblacion_id AS Personas__poblacion_id,
Personas.fnacimiento AS Personas__fnacimiento,
Personas.ffallecimiento AS Personas__ffallecimiento,
Personas.comentarios AS Personas__comentarios,
Personas.imagen_id AS Personas__imagen_id,
Personas.idpadre AS Personas__idpadre,
Personas.idmadre AS Personas__idmadre,
Personas.genero AS Personas__genero,
Personas.soltero AS Personas__soltero,
Personas.casa_id AS Personas__casa_id,
Personas.muerto AS Personas__muerto,
if(Personas.id != 151, Personas.id, Personas2.id) AS id,
if(Personas.id != 151, Personas.nombre, Personas2.nombre) AS nombre, if(Personas.id != 151, Personas.genero, Personas2.genero) AS genero, if(Personas.id != 151, Personas.imagen_id, Personas2.imagen_id) AS foto, if(Personas.id != 151, Personas.primer_apellido, Personas2.primer_apellido) AS primer_apellido,
if(Personas.id != 151, Personas.segundo_apellido, Personas2.segundo_apellido) AS segundo_apellido,
if(Matrimonios.fecha is null, Matrimonios.fecha, "no consta fecha") AS fecha_matrimonio
FROM personas Personas
LEFT JOIN imagenes Imagenes ON Imagenes.id = imagen_id
LEFT JOIN personas Personas2 ON Personas2.id = Personas.id
LEFT JOIN matrimonios Matrimonios ON 1 = 1
WHERE (Personas.id = Matrimonios.idhombre
AND Personas2.id = Matrimonios.idmujer
AND (Matrimonios.idhombre = 151 or Matrimonios.idmujer = 151))
ORDER BY fecha_matrimonio ASC
Warning (4096): Argument 1 passed to Cake\Database\Expression\QueryExpression::_addConditions() must be of the type array, null given, called in /srv/www/cake-arbol/vendor/cakephp/cakephp/src/Database/Expression/QueryExpression.php on line 171 and defined [CORE/src/Database/Expression/QueryExpression.php, line 681]
Warning (2): Invalid argument supplied for foreach() [CORE/src/Database/Expression/QueryExpression.php, line 687]