Я строю сайт, который нуждается в фильтрации фильтров на основе их вариантов. Например, у виллы есть варианты: Wi-Fi, бассейн, животные разрешены.Доктрина 2 manyToMany отношение Выбор объекта с AND
При фильтрации Я предоставляю варианты: Wi-Fi и бассейн. Теперь мне нужен отфильтрованный список вилл, основанный на BOTH этих вариантах. Поэтому я хочу, чтобы виллы имели как Wi-Fi, так и бассейн.
My Villa Entity выглядит следующим образом:
class Object
{
/**
* @var integer
*
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;
/**
* @var string
*
* @ORM\Column(name="name", type="string", length=255)
*/
private $name;
/**
* @ORM\manyToMany(targetEntity="Option", mappedBy="objects")
*/
private $options;
//...
}
И мой вариант Entity выглядит следующим образом:
class Option
{
/**
* @var integer
*
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;
/**
* @var string
*
* @ORM\Column(name="name", type="string", length=255)
*/
private $tag;
/**
* @ORM\manyToMany(targetEntity="Object", inversedBy="options")
* @ORM\JoinTable(name="Object_Options")
*/
private $objects;
//...
}
У меня есть массив фильтров идентификаторами $filters
, с которым мне нужно фильтровать.
Я просто не могу понять, как это осуществить.
теперь у меня есть этот
$qb = $this->getEntityManager()->createQueryBuilder();
$qb->select("o")->from("Object", "o");
if ($filters && count($filters) > 0) {
$qb->innerJoin("o.options", "f");
$qb->andWhere($qb->expr()->in("f.id", $filters));
}
$query = $qb->getQuery();
, но это на самом деле делает противоположное тому, что мне нужно. Это фильтрует виллу на основе опций, но использует OR вместо AND. Таким образом, это дает мне результаты для того, где Вилла имеет Wi-Fi или бассейн.
Таким образом, в псевдо-код мне нужно:
get all Objects that have every given option (and maybe more)
Может ли один пролить некоторый свет на это?
Благодарим за отправку решения! Кстати, совершенно правильно ответить на ваш собственный вопрос и пометить ваш ответ как принятый. На самом деле, это предпочтительный способ определить ваш вопрос как решенный. –
Спасибо за эту информацию Слава Формин II. Я не обычный плакат на SO (как вы можете видеть по этому очень позднему отклику. Поэтому я не знал о доступных вариантах :-) Как вы упомянули. Благодарю. Надеюсь, это тоже помогло тебе. –