2012-01-20 63 views
1

我嘗試在我的CompanyRepository學說2 JOIN ON錯誤

$qb = $this->_em->createQueryBuilder(); 
$qb->select(array('c', 'ld')) 
     ->from('Model\Entity\Company', 'c') 
     ->leftJoin('c.legaldetails', 'ld', \Doctrine\ORM\Query\Expr\Join::ON, 'c.companyid=ld.companyid'); 

$query = $qb->getQuery(); 
echo($query->getSQL()); 

執行此查詢時,我嘗試做我有錯誤:

致命錯誤:未捕獲的異常「學說\ ORM \查詢\ QueryException'消息'[Syntax Error] line 0,col 69:錯誤:字符串預計結束,在/home/raccoon/web/freetopay.dev/www/class/new/library/Doctrine/中獲得'ON' ORM/Query/QueryException.php on line 42

這些是我的模特:

<?php  
namespace Model\Entity; 

use Doctrine\ORM\Mapping as ORM; 
use Doctrine\Common\Collections\ArrayCollection; 

/** 
* Company 
* 
* @ORM\Table(name="Company") 
* @ORM\Entity(repositoryClass="\Model\Repository\CompanyRepository") 
*/ 
class Company 
{ 
/** 
* @var integer $companyid 
* 
* @ORM\Column(name="CompanyID", type="integer", nullable=false) 
* @ORM\Id 
* @ORM\GeneratedValue(strategy="IDENTITY") 
*/ 
private $companyid; 

/** 
* @var \Model\Entity\LegalDetails $legaldetails 
* 
* @ORM\OneToOne(targetEntity="\Model\Entity\Legaldetails", mappedBy="companyid") 
*/ 
private $legaldetails; 

//other fields 

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

//setters and getters 

和legaldetails實體:

<?php 
namespace Model\Entity; 

use Doctrine\ORM\Mapping as ORM; 
use Doctrine\Common\Collections\ArrayCollection; 

/** 
* Legaldetails 
* 
* @ORM\Table(name="LegalDetails") 
* @ORM\Entity 
*/ 
class Legaldetails 
{ 
/** 
* @var integer $legalid 
* 
* @ORM\Column(name="LegalID", type="integer", nullable=false) 
* @ORM\Id 
* @ORM\GeneratedValue(strategy="IDENTITY") 
*/ 
private $legalid; 

/** 
* @var \Model\Entity\Company $company 
* 
* @ORM\Column(name="CompanyID", type="integer", nullable=false) 
* @ORM\OneToOne(targetEntity="\Model\Entity\Company", inversedBy="companyid") 
* @ORM\JoinColumn(name="companyid", referencedColumnName="companyid") 
*/ 
private $company; 

有什麼不對?

回答

1

有一個關於如何JOIN與DQL here工作相當清楚的解釋:

With DQL when you write a join, it can be a filtering join (similar to the concept of join in SQL used for limiting or aggregating results) or a fetch join (used to fetch related records and include them in the result of the main query). When you include fields from the joined entity in the SELECT clause you get a fetch join

這應該是足夠的得到你想要的東西(關於法律信息所有公司信息加載):

$query = $em->createQuery('SELECT c, ld FROM \Model\Entity\Company c JOIN c.legaldetails ld'); 
$companies = $query->getResult(); // array of Company objects with the legaldetails association loaded 

編輯:

我在查詢中使用了常規連接,因此沒有合法信息的公司不會在查詢中返回。如果你想ALL公司,即使他們沒有合法的信息加載,你應該嘗試用左手參加,你在做

+0

非常感謝!問題解決了!我changet我的實體註釋這樣'/ ** * @var Legaldetails $ legaldetail * * @ORM \ OneToOne(targetEntity = 「Legaldetails」 的mappedBy = 「公司」) */ 私人$ legaldetail;'在公司實體和'/ ** * 公司@var $公司 * * @ORM \ OneToOne(targetEntity = 「公司」) * @ORM \ JoinColumns({ * @ORM \ JoinColumn(name = 「CompanyID」,referencedColumnName =「CompanyID」,unique = true) *}) */ private $ company;'in legaldetails –

+0

+1,still working(Symfony 2.5) – mboullouz

0

我們都以SQL來思考。但在DQL WITH中使用而不是ON。 example

編輯: 如果您知道SQL,爲什麼你不使用的查詢,如:

$query = $this->getEntityManager()->createQuery(' 
     SELECT t... 
    '); 

放在那裏,你認爲應該在那裏的SQL,檢查它。如果一切正常 - 問題是在教義的代碼,如果沒有 - 的錯誤是在SQL/DQL

+0

不,這沒有幫助。我必須使用ON運算符。 我無法聲明my:companyid變量(如'WITH c.companyid =:companyid WHERE ld。companyid =:companyid') 我嘗試獲取有關公司的所有公司的信息,並加入了有關公司的法律信息 –

+0

請查看編輯過的答案。 – Gangnus

+0

問題出在實體註釋中。但是,謝謝你的幫助!=) –

10

對於那些誰來到這裏有關的問題「字符串的預計結束,得到了‘ON’」 ,但無法找到正確的答案,因爲我不能(好吧,有答案,但不完全關於QueryBuilder)。一般來說,是的,你不需要指定加入列。但是如果你需要添加額外的過濾。例如,我正在尋找添加一個額外的條件(允許加入空值)。

這裏的問題是即使常量Join :: ON存在(並且Join表達式中的註釋也提到它),但DQL中沒有ON。相反,應該使用WITH(Join :: WITH)。

這是我的使用示例:

$qb->leftJoin('p.metadata', 'm', Join::WITH, "IFNULL(m.name, '') = 'email'"); 

附:預測關於IFNULL()的問題 - 它是Benjamin Eberlei's Doctrine extension

+4

如果有人感興趣Join :: WITH的完整名稱空間是 \ Doctrine \ ORM \ Query \ Expr \ Join :: WITH –