关于sql:Symfony2-Dctrine DQL-选择与另一个表行不相关的行

Symfony2 - Doctrine DQL - select rows that are not related to another table row

我有两个表OfferOfferSuggestion,它们具有FOREIGN_KEY并与Offer有关。我想获取尚未与OfferSuggestion的任何行相关的Offer行。

优惠:

1
2
3
id      name
1       offer1
2       offer2

要约建议:

1
2
id    offer_id   name
1     2          suggestion2

在这种情况下,我应该得到没有建议的offer1

到目前为止,我已经尝试过了,但是没有用:

1
2
3
4
5
$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.

有什么想法我想念的吗?


您可以简单地引用对象实例,如下所示:

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

您还可以使用querybuilder创建子查询:

例如,仅为了演示如何在select语句中使用子查询select语句,假设我们要查找所有尚未编译地址的用户(地址表中没有记录),该操作如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
 // 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();

这项工作:

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

我只是在猜测,但是您可以尝试吗?