簡體   English   中英

與Doctrine2(Symfony2)的內部聯接

[英]InnerJoin with Doctrine2 (Symfony2)

我是Symfony2的新手(〜1周)。 我在BudgetData實體上有一個manyToOne,它加入了實體BudgetDescription的ID。 我創建了一個要為Doctrine復制的SQL查詢:

SELECT d, e
FROM BudgetData d
INNER JOIN BudgetDescription e 
ON d.budgetDescription_id = e.id

BudgetData表:id,年,值,budgetDescription_id(FK)

預算描述表:ID,descriptionName

到目前為止我嘗試過的是:

    $em = $this->getDoctrine()->getManager();
    $qb = $em->getRepository('MainBundle:BudgetData');
    $qb = $em->createQueryBuilder('d');

    $dataQuery = $qb->select('d, c')
                    ->innerJoin('c.id', 'c', Join::ON, 'd.budgetDescription_id = c.id')
                    ->getQuery();

    $dataQuery = $dataQuery->getArrayResult();

知道如何在DQL中執行SQL查詢嗎?

謝謝 !

如果您在BudgetDataEntity中有一個名為budgetDescription且具有屬性$ budgetDescription的關系,則可以在BudgetDataRepository中執行以下操作:

    public function myInnerJoin()
    {

           $qb = $this->createQueryBuilder('f') 
                ->select('f','g')
                ->innerJoin('f.budgetDescription', 'g'); 

           return $qb->getQuery()->getArrayResult();
    }

並在控制器中

$repository = $this->getDoctrine()->getManager()->getRepository('AcmeBundle:BudgetData');
$result = $repository->myInnerJoin(); 

那是我的猜測

更好的解決方案是利用准則ORM的優勢。 簡而言之,創建具有正確定義的關聯的實體類,然后根據需要在實體的存儲庫類中創建自定義查詢方法以進行查找。 例:

BudgetData實體:

use Doctrine\ORM\Mapping as ORM;
use MainBundle\Entity\BudgetDescription;

...

/**
 * @ORM\Table(name="budget_data")
 * @ORM\Entity(repositoryClass="MainBundle\Repository\BudgetDataRepository")
 */
class BudgetData
{
    // properties here

    /**
     * @ORM\ManyToOne(targetEntity="BudgetDescription")
     * @ORM\JoinColumn(name="category", referencedColumnName="id", nullable=false)
     */
    private $budgetDescription;

    ...

    /**
     * Set budgetDescription
     *
     * @param BudgetDescription $budgetDescription
     * @return BudgetData
     */
    public function setBudgetDescription(BudgetDescription $budgetDescription)
    {
        $this->budgetDescription = $budgetDescription;

        return $this;
    }

    /**
     * Get budgetDescription
     *
     * @return BudgetDescription
     */
    public function getBudgetDescription()
    {
        return $this->budgetDescription;
    }
}

BudgetDescription實體:

use Doctrine\ORM\Mapping as ORM;

...

/**
 * @ORM\Table(name="budget_description")
 * @ORM\Entity
 */
class BudgetDescription
{
    // properties here
    ...

    /**
     * @ORM\Id
     * @ORM\Column(name="id", type="integer")
     * @ORM\GeneratedValue(strategy="IDENTITY")

     */
    private $id;

    ...
}

現在,Doctrine將為您管理此關聯,以便從BudgetData獲取BudgetDescription實體BudgetData就是調用BudgetData實例的getBudgetDescription()方法,如下所示:

$budgetData = $em->getRepository('MainBundle:BudgetData')->findOneById(3);
$budgetDescription = $budgetData->getBudgetDescription();

和瞧。 在上面的示例中,Doctrine在數據庫中檢索ID = 3的budget_data行,並使用該數據BudgetData實體。 然后,當您調用getBudgetDescription()方法時,它將獲取budget_description表中的關聯行,並budget_description BudgetDescription實體。 您可以通過在關聯注釋中使用fetch="EAGER"消除第二次查找。 但是,默認情況下,Doctrine惰性加載數據,因此它僅加載您需要的內容。

我希望這有幫助。

ps我建議您在主鍵和外鍵之前加上表名。 因此,在上面的示例中,您的budget_data表將具有外鍵budget_description_id而您的budget_description表將具有主鍵budget_description_id 這樣做有很多充分的理由,其中最重要的是表之間關聯的清晰性。

我使用了一個簡單的查詢。 以下代碼可以工作,但是如果您有其他(更好)的解決方案,我很樂意擁有。

$em = $this->getDoctrine()->getManager();

$qb = $em->createQuery("SELECT d.year, d.value, e.descriptionName FROM MainBundle:BudgetData d INNER JOIN MainBundle:BudgetDescription e WITH d.category = e.id");

$newQuery = $qb->getArrayResult();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM