2011-07-28 17 views
23

Potrzebuję utworzyć natywne zapytanie SQL z kilkoma związkami i podkwerendami. Wygląda mniej więcej tak:Korzystanie z natywnego zapytania SQL bez klasy encji

SELECT res.id, COUNT(*) as count_ids 
FROM (
    SELECT a.id FROM ... a WHERE ... LIKE ('%:param%') 
    UNION ALL 
    SELECT b.id FROM ... b WHERE ... LIKE ('%:param%') 
    UNION ALL 
    ... 
) res 
GROUP BY res.id 
ORDER BY count_ids asc 

Wynik nie będzie zgodny z żadnym elementem używanym w mojej aplikacji. Czy jest możliwe utworzenie ResultSetMapping z "anonimowym" obiektem? A może jest przynajmniej możliwe, aby utworzyć encję, która nie tworzy tabeli następnym razem, gdy aktualizuję schemat, więc mogę mapować na nią wyniki?

Czy istnieje inny przyjazny dla doktryny sposób radzenia sobie z takimi zapytaniami? Dokonywanie zmian w bazie danych nie jest możliwe, ponieważ mam do czynienia ze starszymi rzeczami, których nie można dotknąć. Wolałbym też, gdybym zrobił wszystko po stronie bazy danych, nie angażując w to dużo PHP.

Odpowiedz

38

Czy masz szczególną potrzebę mapowania wyników do obiektu domeny? Jeśli nie, można użyć DBAL zrobić zwykły stary kwerendę, która będzie zwracać tablicę, jak wyszczególniono w the Symfony2 cookbook i the Doctrine DBAL documentation:

$conn = $this->container->get('database_connection'); 
$sql = 'SELECT res.id, COUNT(*)...'; 
$rows = $conn->query($sql); 
+0

Dzięki, nie miałem pojęcia, że ​​istnieje coś takiego jak DBAL Doktryna. –

+2

http://www.metod.si/get-doctrine2-dbal-connection-for-different-databases-in-symfony2/ => jeśli chcesz połączyć się z więcej niż 1 db – DOZ

+0

Woa dziękuje, nativeSQL o doktrynie jest tak okropne, z powrotem do podstawowego! –

1

użytkowania addScalarResult metoda ResultSetMapping

$rsm = new ResultSetMapping(); 

$rsm->addScalarResult('cnt', 'cnt'); 
$rsm->addScalarResult('id', 'id'); 

$query = $this->em->createNativeQuery('SELECT count(*) AS cnt, id_column as id FROM your_table group by id', $rsm); 

$result = $query->getResult(); 

var_dump($result); 

Tablica wyników:

array (size=1) 
    0 => 
    array (size=2) 
     'cnt' => int 1 
     'id' => int 15 
Powiązane problemy