2016-12-19 5 views
3

У меня есть две таблицы Offer и OfferSuggestion, которая имеет 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 statement внутри оператора 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)'; 

Я просто угадать, но вы можете попробовать?