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.

Alternativa para `fetchAllAssociative()` y ejecutar en Doctrine.

Estoy llamando a un procedimiento almacenado utilizando SQL nativo a través de Doctrine. Los métodos fetchAllAssociative() y execute están obsoletos. ¿Cuáles son las alternativas?

$sql = 'CALL spWithParams(:param)';
$stmt = $this->getEntityManager()->getConnection()->prepare($sql);
$stmt->execute(["param" => "test"]);
print_r($stmt->fetchAllAssociative());

No tengo planeado mapear la respuesta a una entidad utilizando ResultSetMapping() como se menciona en este enlace, ya que agregaré mi propio envoltorio personalizado.

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Las alternativas al uso de fetchAllAssociative() y execute(), los cuales ahora están obsoletos en Doctrine, son las siguientes:

    1. fetchAll() – Esto devolverá los resultados como un array numérico de arrays asociativos con claves tanto de nombre de columna como numéricas.
    2. fetchOne() – Este método se puede utilizar para recuperar un solo valor del conjunto de resultados, en lugar de todo el conjunto.
    3. fetchColumn() – Este método se utiliza cuando solo quieres recuperar una sola columna de una única fila, en lugar de obtener todo el conjunto de resultados.

    Aquí tienes un ejemplo de cómo quedará el código cuando se utiliza fetchAll():

    $sql = 'CALL spWithParams(:param)';
    $stmt = $this->getEntityManager()->getConnection()->prepare($sql);
    $stmt->execute([":param" => "test"]);
    $results = $stmt->fetchAll();
    print_r($results);
    

    Alternativamente, también puedes utilizar fetch() en un bucle para recuperar cada fila una a la vez:

    $sql = 'CALL spWithParams(:param)';
    $stmt = $this->getEntityManager()->getConnection()->prepare($sql);
    $stmt->execute([":param" => "test"]);
    while ($row = $stmt->fetch()) {
        // procesa cada fila
    }
    

Comments are closed.