Doctrine — запрос один-ко-многим, однонаправленный с объединением таблиц соединений с обратной стороны

Моя цель:

Создать универсальную ассоциацию, где первая сущность (например, категория) можно использовать много раз для других объектов (напр. пост, статья)

пример

У Post есть категории, а у Article есть категории, но Article и Post — это совершенно разные сущности. (соединение невозможно для обоих одновременно)


Пример картирования:

Сообщение

<?php
/** @Entity */
class Post
{
// ...

/**
* @ManyToMany(targetEntity="Category")
* @JoinTable(name="post_categories",
*      joinColumns={@JoinColumn(name="post_id", referencedColumnName="id")},
*      inverseJoinColumns={@JoinColumn(name="category_id", referencedColumnName="id", unique=true)}
*      )
*/
private $categories;

public function __construct()
{
$this->categories= new \Doctrine\Common\Collections\ArrayCollection();
}

// ...
}

Статья

<?php
/** @Entity */
class Article
{
// ...

/**
* @ManyToMany(targetEntity="Category")
* @JoinTable(name="article_categories",
*      joinColumns={@JoinColumn(name="article_id", referencedColumnName="id")},
*      inverseJoinColumns={@JoinColumn(name="category_id", referencedColumnName="id", unique=true)}
*      )
*/
private $categories;

public function __construct()
{
$this->categories= new \Doctrine\Common\Collections\ArrayCollection();
}

// ...
}

категория

<?php
/** @Entity */
class Category
{
// ...
/**
* @ORM\Column(type="string", length=100)
*/
protected $name;
}

Как вы можете видеть, это один-ко-многим, однонаправленный с объединением таблиц соединения.
Теперь с этим я Можно запрос для одного Post категории и Article категории, но Категория не знает о публикации или статье. Это хорошо, потому что я могу использовать Category несколько раз.


Где проблема?

Мне нужна нагрузка ВСЕ Posts или же Articles которые содержат один Category или же Categories,

пример

У нас есть 20 сообщений с категорией имени "symfony" (ID: 2) и 10 с именем категории "doctrine" (ID: 3). Теперь мне нужен запрос, чтобы загрузить все сообщения с категорией "doctrine"

findPostsByCategoryId( $id );
// findPostsByCategoryId( 3 );

ИЛИ ЖЕ все сообщения с и то и другое категории

findPostsByCategories( Array $array );
// findPostsByCategories( array(2,3) );

Как я могу это сделать?

Мне нужно решение для этого случая или решение для достижения моей цели.
Каждый совет ценится.

Постскриптум У меня есть другая связанная проблема с этим отображением, описанным здесь

Проверка уникальности для однонаправленного соединения «Таблица ко многим» с таблицей соединений

5

Решение

Если я не читаю ваш вопрос, это кажется довольно простым:

Получить все сообщения с определенной категорией:

$qb = $this->getEntityManager()->createQueryBuilder();

$qb->select('p')
->from('SomeBundle:Post', 'p')
->join('p.categories', 'c')
->where('c.id = :categoryId')
->setParameter('categoryId', $categoryId)
->getQuery()
->getResult();

Получить все сообщения с рядом категорий:

$qb = $this->getEntityManager()->createQueryBuilder();

$qb->select('p')
->from('SomeBundle:Post', 'p')
->join('p.categories', 'c')
->where($qb->expr()->in('c.id', ':categoryIds'))
->setParameter('categoryIds', $categoryIds) // array of ids
->getQuery()
->getResult();
6

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]