Symfony & Doctrine заставляет работать объединенный запрос - PullRequest
0 голосов
/ 05 марта 2012

У меня есть SQL-запрос, который возвращает все строки в одной таблице (стране), у которых есть связанная запись в другой таблице (утки), но я изо всех сил пытаюсь превратить это в DQL. Это стандартное отношение «один-много», так как в каждой стране может быть несколько уток, я считаю, что все настроено правильно, так как я могу вернуть уток в пределах страны и вернуть страну, в которой утка использует стандартный код.

Рабочий запрос:

SELECT c.* FROM country c 
INNER JOIN ducks d 
ON c.id = d.country_id 
GROUP BY c.country 
ORDER BY c.country ASC

Я пытался преобразовать это в:

SELECT c FROM WfukDuckBundle:Country c 
INNER JOIN WfukDuckBundle:Ducks d 
ON c.id = d.country_id 
GROUP BY c.country 
ORDER BY c.country ASC

, которая выдает следующую ошибку:

[Semantical Error] line 0, col 79 near 'd ON': Error: Identification Variable 
WfukDuckBundle:Ducks used in join path expression but was not defined before. 

Я довольно новичок в Symfony / Doctrine, поэтому я подозреваю, что это, вероятно, что-то очевидное!

Я использую Symfony 2.0.11 с доктриной

Обновление: Я также пробовал:

SELECT c FROM WfukDuckBundle:Country c 
INNER JOIN c.ducks d 
ON c.id = d.country_id 
GROUP BY c.country 
ORDER BY c.country ASC

где «утки» определены в классе Country как:

/**
 * @ORM\OneToMany(targetEntity="Ducks", mappedBy="country")
 */
protected $ducks;

public function __construct()
{
    $this->ducks = new ArrayCollection();
}

определение страны в классе уток:

/**
* @ORM\ManyToOne(targetEntity="Country", inversedBy="ducks")
* @ORM\JoinColumn(name="country_id", referencedColumnName="id")
*/
private $country;

1 Ответ

5 голосов
/ 06 марта 2012

Сделайте себе одолжение и используйте построитель запросов.Легче читать и обновлять и повторно использовать ваши запросы

<?php

namespace Vendor\Prefix\Repository;

use Doctrine\ORM\EntityRepository;

class SomeRepository extends EntityRepository
{
    public function countryDucks()
    {
        // $em is the entity manager
        $qb = $em->createQueryBuilder();

        $qb
            ->select('country', 'duck')
            ->from('WfukDuckBundle:Country', 'country')
            ->innerJoin('country.ducks', 'duck')
            ->groupBy('country.country')
            ->orderBy('country.country', 'ASC')
        ;

        $query = $qb->getQuery();

        // Potential Hydration Modes
        // --------------------------------
        // Doctrine\ORM\Query::HYDRATE_OBJECT
        // Will give you an array of your object entities
        // --------------------------------
        // Doctrine\ORM\Query::HYDRATE_ARRAY 
        // Will give you an array mimicking 
        // your object graph 
        // --------------------------------

        return $query->getResult(\Doctrine\ORM\Query::HYDRATE_ARRAY);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...