[英]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的優勢。 簡而言之,創建具有正確定義的關聯的實體類,然后根據需要在實體的存儲庫類中創建自定義查詢方法以進行查找。 例:
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;
}
}
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.