2016-12-19 54 views
3

我有两个表OfferOfferSuggestion,它有FOREIGN_KEY并且与Offer有关。我想获得Offer的行,这些行与OfferSuggestion的任何行都没有关系。Symfony2 - Doctrine DQL - 选择与另一个表格行无关的行

优惠:

id  name 
1  offer1 
2  offer2 

OfferSuggestion:

id offer_id name 
1  2   suggestion2 

在这种情况下,我应该得到offer1不具备建议。

到目前为止,我已经试过了,但不工作:

$query = 'SELECT o FROM IndexBundle:Offer o '. 
    'WHERE NOT EXISTS ('. 
    'SELECT s.offer FROM IndexBundle:OfferSuggestion s '. 
    'WHERE o.id = s.offer)'; 
$query = $em->createQuery($query); 

我得到一个错误:

[Semantical Error] line 0, col 91 near 'offer FROM IndexBundle:OfferSuggestion': Error: Invalid PathExpression. Must be a StateFieldPathExpression.

任何想法我很想念?

回答

2

你可以简单地参照对象实例如下:

$query = 'SELECT o FROM IndexBundle:Offer o '. 
    'WHERE NOT EXISTS ('. 
    'SELECT s FROM IndexBundle:OfferSuggestion s '. 
    'WHERE o = s.offer)'; 

你也可以用的QueryBuilder创建子查询:

作为例子,只为证明HOW-TO使用子查询select语句在SELECT语句中,假设我们找到所有尚未编译地址的用户(地址表中没有记录):

// get an ExpressionBuilder instance, so that you 
$expr = $this->_em->getExpressionBuilder(); 

// create a subquery in order to take all address records for a specified user id 
$sub = $this->_em->createQueryBuilder() 
    ->select('a') 
    ->from($this->_addressEntityName, 'a') 
    ->where('a.user = u.id'); 


$qb = $this->_em->createQueryBuilder() 
    ->select('u') 
    ->from($this->_userEntityName, 'u') 
    ->where($expr->not($expr->exists($sub->getDQL()))); 

return $qb->getQuery()->getResult(); 
+0

它完美的作品!万分感谢! –

1

这是否工作:

$query = 'SELECT o FROM IndexBundle:Offer o '. 
    'WHERE NOT IN ('. 
    'SELECT s.offer_id FROM IndexBundle:OfferSuggestion s '. 
    'WHERE o.id = s.offer_id)'; 

我只是猜测,但你可以试试吗?

相关问题