es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Subconsulta en CakePhp con InnerJoin

Estoy tratando de convertir esta consulta:

sql
SELECT
pdd.pedinte_id, pdd.data, pdd.situacao as Situacao, pdd.valor_total, pdd.qtd_etiquetas,
(
SELECT count(pdi.envio_id)
FROM pedinte_item pdi
INNER JOIN envios env ON
pdi.envio_id = env.envio_id
WHERE
pdi.pedinte_id = pdd.pedinte_id AND
env.Situacao = 2
) AS TemErros
FROM pedinte pdd
left join user usr on
usr.user_id = pdd.user_id
WHERE pdd.user_id IS NOT NULL AND pdd.pedinte_id IS NOT NULL;

a CakePhp:

php
eliminado código, puede estar muy incorrecto.

Sin éxito.

Tengo 4 tablas:

  • pedinte (pdd)
  • pedinte_item (pdi)
  • envios (env)
  • user (usr)

pedinte > pedinte_item > envios (count)

No puedo creerlo, es más difícil hacer el generador de consultas que el código mysql.

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Como especialista en TI especializado en php, mysql, cakephp y query-builder, puedo ayudar a convertir la consulta SQL a CakePHP utilizando el generador de consultas. Aquí está el código traducido:

    $query = $this->Pedinte->find();
    $query
        ->select([
            'pedinte_id' => 'Pedinte.pedinte_id',
            'data' => 'Pedinte.data',
            'Situacao' => 'Pedinte.situacao',
            'valor_total' => 'Pedinte.valor_total',
            'qtd_etiquetas' => 'Pedinte.qtd_etiquetas',
            'TemErros' => $query->func()->count('PedinteItem.envio_id')
        ])
        ->leftJoinWith('User')
        ->leftJoinWith('PedinteItem.Envio')
        ->where([
            'Pedinte.user_id IS NOT' => NULL,
            'Pedinte.pedinte_id IS NOT' => NULL,
            'Envio.Situacao' => 2
        ])
        ->group('Pedinte.pedinte_id');
    
    $results = $query->toArray();
    

    Explicación:

    • Primero, obtenemos un objeto de consulta llamando a $this->Pedinte->find(), ya que asumimos que Pedinte es el nombre del modelo para la tabla pedinte.
    • Usamos select() para elegir los campos devueltos por la consulta. También utilizamos $query->func()->count() para contar el número de registros en la tabla PedinteItem donde Envio.Situacao es 2. Observa que utilizamos alias para que los campos devueltos coincidan con la consulta SQL original.
    • Utilizamos leftJoinWith() para unir las tablas User, PedinteItem y Envio. CakePHP crea automáticamente las declaraciones de unión necesarias para cada uno de los modelos que especificamos.
    • Utilizamos where() para especificar las condiciones de la consulta. Utilizamos IS NOT en lugar de != debido a las convenciones de CakePHP. Observa que necesitamos usar Envio.Situacao en lugar de Situacao ya que nos unimos con la tabla Envio.
    • Utilizamos group() para agrupar los resultados por pedinte_id tal como en la consulta SQL original.
    • Finalmente, llamamos a toArray() para ejecutar la consulta y devolver una matriz de resultados.

    Espero que esto te ayude a convertir la consulta SQL a CakePHP utilizando el generador de consultas. Avísame si tienes alguna pregunta o necesitas más ayuda.

Comments are closed.