У меня есть список:
Категория 1
- Элемент 1
- Элемент 2
- Элемент 3
Категория 2
Категория 3
Таким образом, создаются следующие таблицы:
Категория
class Category
{
...
/**
* @ORM\Column(type="integer")
*/
private $weight;
/**
* @ORM\Column(type="boolean")
*/
private $isDeleted;
/**
* @ORM\OneToMany(targetEntity="CategoryItemMapping", mappedBy="category")
*/
private $categoryItemMapping;
}
Элемент
class Item
{
...
/**
* @ORM\Column(type="boolean")
*/
private $isDeleted;
/**
* @ORM\Column(type="boolean")
*/
private $isPublic;
/**
* @ORM\OneToMany(targetEntity="CategoryItemMapping", mappedBy="item")
*/
private $categoryItemMapping;
}
CategoryItemMapping
class CategoryItemMapping
{
/**
* @ORM\Column(type="integer")
*/
private $weight;
/**
* @ORM\ManyToOne(targetEntity="Category", inversedBy="categoryItemMapping")
*/
private $category;
/**
* @ORM\ManyToOne(targetEntity="Item", inversedBy="categoryItemMapping")
*/
private $item;
}
и построитель запросов, который я сделал до сих пор:
$query = $this->entityManager->createQueryBuilder()
->select('c, cim')
->from('AppBundle:Category', 'c')
->leftJoin('c.categoryItemMapping', 'cim')
->leftJoin('cim.item', 'i')
->andWhere('c.isDeleted = false AND ((i.id IS NOT NULL AND i.isDeleted = false AND i.isPublic = true) OR (i.id IS NULL))')
->addOrderBy('c.weight', 'asc')
->addOrderBy('cim.weight', 'asc')
;
Цель -чтобы показать все категории c
, которые удалены nod c.isDeleted = false
, а внутри категорий показать все элементы i
, которые не удалены i.isDeleted = false
и являются общедоступными i.isPublic = true
.
Проблема с приведенным выше запросом заключается в том, что он не показывает категории, содержащие только удаленные элементы или содержащие только элементы, которые не являются общедоступными.
Итак, как мне лучше контролировать то, что должно выводиться вOneToMany
отношение внутри одного построителя запросов?