Respostas:
Aqui está um exemplo de consulta bruta no Doctrine 2 que estou fazendo:
public function getAuthoritativeSportsRecords()
{
$sql = "
SELECT name,
event_type,
sport_type,
level
FROM vnn_sport
";
$em = $this->getDoctrine()->getManager();
$stmt = $em->getConnection()->prepare($sql);
$stmt->execute();
return $stmt->fetchAll();
}
...getConnection()->query($sql);
e não precisei correr$stmt->execute();
EntityManagerInterface $entityManager
e então ligar para$entityManager->getConnection()
//$sql - sql statement
//$em - entity manager
$em->getConnection()->exec( $sql );
Eu comecei a trabalhar fazendo isso, supondo que você esteja usando PDO.
//Place query here, let's say you want all the users that have blue as their favorite color
$sql = "SELECT name FROM user WHERE favorite_color = :color";
//set parameters
//you may set as many parameters as you have on your query
$params['color'] = blue;
//create the prepared statement, by getting the doctrine connection
$stmt = $this->entityManager->getConnection()->prepare($sql);
$stmt->execute($params);
//I used FETCH_COLUMN because I only needed one Column.
return $stmt->fetchAll(PDO::FETCH_COLUMN);
Você pode alterar o FETCH_TYPE para atender às suas necessidades.
Conecte-se ao seu gerente e faça uma nova conexão:
$manager = $this->getDoctrine()->getManager();
$conn = $manager->getConnection();
Crie sua consulta e fetchAll:
$result= $conn->query('select foobar from mytable')->fetchAll();
Obtenha os dados do resultado como este:
$this->appendStringToFile("first row foobar is: " . $result[0]['foobar']);
Descobri que a resposta é provavelmente:
Uma NativeQuery permite executar SQL nativo, mapeando os resultados de acordo com suas especificações. Tal especificação que descreve como um conjunto de resultados SQL é mapeado para um resultado Doctrine é representado por um ResultSetMapping.
Fonte: SQL nativo .
Eu tive o mesmo problema. Você deseja olhar o objeto de conexão fornecido pelo gerenciador de entidade:
$conn = $em->getConnection();
Você pode então consultar / executar diretamente nele:
$statement = $conn->query('select foo from bar');
$num_rows_effected = $conn->exec('update bar set foo=1');
Consulte a documentação do objeto de conexão em http://www.doctrine-project.org/api/dbal/2.0/doctrine/dbal/connection.html
Em seu modelo, crie a instrução SQL bruta (o exemplo abaixo é um exemplo de um intervalo de datas que tive que usar, mas substituir o seu. Se você estiver fazendo um SELECT adicione -> fetchall () à chamada execute ().
$sql = "DELETE FROM tmp
WHERE lastedit + INTERVAL '5 minute' < NOW() ";
$stmt = $this->getServiceLocator()
->get('Doctrine\ORM\EntityManager')
->getConnection()
->prepare($sql);
$stmt->execute();
Você não pode, o Doctrine 2 não permite consultas brutas. Pode parecer que sim, mas se você tentar algo assim:
$sql = "SELECT DATE_FORMAT(whatever.createdAt, '%Y-%m-%d') FORM whatever...";
$em = $this->getDoctrine()->getManager();
$em->getConnection()->exec($sql);
O Doctrine irá cuspir um erro dizendo que DATE_FORMAT é uma função desconhecida.
Mas meu banco de dados (mysql) conhece essa função, então basicamente o que está acontecendo é que o Doctrine está analisando essa consulta nos bastidores (e nas suas costas) e encontrando uma expressão que ele não entende, considerando a consulta inválida.
Portanto, se, como eu, você quiser ser capaz de simplesmente enviar uma string para o banco de dados e deixá-la lidar com ela (e deixar o desenvolvedor assumir total responsabilidade pela segurança), esqueça.
Claro que você poderia codificar uma extensão para permitir isso de uma forma ou de outra, mas você também pode usar mysqli para fazer isso e deixar o Doctrine com seu negócio ORM.
mysqldump
s ou carregar dados de despejos anteriores ou eliminar tabelas, geralmente escrevo um script de shell para esse trabalho e, em seguida, escrevo uma tarefa (ou "comando", na linguagem Symfony2 ) que executa o script de shell. O propósito de um ORM, como eu o entendo, é abstrair o trabalho repetitivo, e se você está fazendo algo como truncar uma mesa, não vejo como faria sentido trazer o Doctrine para o cenário, já que o Doctrine não t tornar essa tarefa mais fácil.