Создать универсальную ассоциацию, где первая сущность (например, категория) можно использовать много раз для других объектов (напр. пост, статья)
пример
У 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) );
Мне нужно решение для этого случая или решение для достижения моей цели.
Каждый совет ценится.
Постскриптум У меня есть другая связанная проблема с этим отображением, описанным здесь
Проверка уникальности для однонаправленного соединения «Таблица ко многим» с таблицей соединений
Если я не читаю ваш вопрос, это кажется довольно простым:
Получить все сообщения с определенной категорией:
$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();
Других решений пока нет …