2015-06-19 1 views
0

У меня есть два объекта, назовем их «Девушка» и «Особенность». Сущность «Девушка» находится в ненаправленном отношении ManyToMany с «Особенностью».Запрос Doctrine2 (Builder) теряет отношения после использования фразы «где» и «в»

У меня есть страница с простой формой поиска. Я хочу найти Девушек по характеристикам. То, что я получаю после отправки формы на стороне сервера, - это список идентификаторов функций, и я должен вернуть список девочек, которые выбрали функции, перечисленные со всеми другими функциями, у этой девушки есть.

Давайте посмотрим на это: ╔════════════╦═══════════════╦═══════════════╦═══════════════╗ ║ ║ (1) Feature 1 ║ (2) Feature 2 ║ (3) Feature 3 ║ ╠════════════╬═══════════════╬═══════════════╬═══════════════╣ ║ (1) Girl 1 ║ Yes ║ Yes ║ No ║ ║ (2) Girl 2 ║ Yes ║ No ║ Yes ║ ╚════════════╩═══════════════╩═══════════════╩═══════════════╝

Числа в скобках являются предприятия идентификатор.

Что я делаю в первый является:

$qbd = $this->getQbd('AppBundle:Girl', 'g') 
     ->select('g, gf') 
     ->leftJoin('g.features', 'gf'); 

После получения данных (особенности идентификаторы) из URL (becausce метод формы использования GET) и положить их в $ имеется массив, я выполняю что-то вроде этого:

if (!empty($features)) { 
    $qbd->where(
     $qbd->expr()->in('gf.id', ':features') 
    )->setParameter('features', $features); 
} 

Простой, насколько это возможно.

Все в порядке. Почти.

Когда я пытаюсь выполнить поиск девушек с характеристиками id равными 2 и 3, я получаю в результате обе Девушки (что хорошо). К сожалению, каждый из них имеет только функцию 2 и 3 (для этого случая, когда я пытаюсь выполнить для каждой из них $ girl-> getFeatures()), даже если оба они также должны содержать ссылку на функцию 1.

Что я делаю неправильно? Я уже пытался создавать другие, более сложные запросы для этого случая, но с каждым из них в конце я получил ту же проблему.

ответ

0

Вы можете использовать «ЧЛЕН О« Конструкция DQL.

Например, вы можете сделать так:

$qb->from('AppBundle:Girl', 'g') 
    ->select('g') 
    ->andWhere(':feature MEMBER OF g.features') 
    ->setParameter('feature', $feauture); 

Плохая вещь она работает только с одной особенностью. Например, если и нужно, чтобы получить девочек, имеющих функции A и B и нужно сделать так:

$qb->from('AppBundle:Girl', 'g') 
    ->select('g') 
    ->andWhere(':featureA MEMBER OF g.features') 
    ->setParameter('featureA', $featureA) 
    ->andWhere(':featureB MEMBER OF g.features') 
    ->setParameter('featureB', $featureB); 

Это самый чистый способ для поиска некоторого объекта в коллекции, которые я знаю. Но если вам нужно найти какую-нибудь сущность (девушку), у которой есть много связанных объектов (функций), вы столкнетесь с некоторыми проблемами производительности, используя этот подход. В этом случае, возможно, лучше использовать подзапросы.