Doctrine 2.1 DQL - многие-ко-многим запрашивают несколько значений - элемент в нескольких категориях? - программирование
Подтвердить что ты не робот

Doctrine 2.1 DQL - многие-ко-многим запрашивают несколько значений - элемент в нескольких категориях?

Это может показаться рудиментарным запросом, но я не могу заставить его работать, поэтому я либо пропускаю что-то глупое, либо не понимаю, как это должно быть сделано. Спасибо заранее.

У меня есть два объекта doctrine с отношением "многие ко многим": "Элементы и категории". К ним присоединяются items_has_categories.

/**
* Item
*
* @Table(name="items")
* @Entity(repositoryClass="Entity\Repository\Item")
*/
class Item
{

....

 /**
 * @var Categories
 *
 * @ManyToMany(targetEntity="Categorie", inversedBy="items", cascade={"persist"})
 * @JoinTable(name="items_has_categories",
 *   joinColumns={
 *     @JoinColumn(name="items_id", referencedColumnName="id")
 *   },
 *   inverseJoinColumns={
 *     @JoinColumn(name="categories_id", referencedColumnName="id")
 *   }
 * )
 */
private $categories;

....
}

/**
* Categorie
*
* @Table(name="categories")
* @Entity(repositoryClass="Entity\Repository\Categorie")
*/
class Categorie
{
 .....

/**
 * @var Items
 *
 * @ManyToMany(targetEntity="Item", mappedBy="categories")
 */
private $items;

....
}

И то, что я пытаюсь сделать, - это запустить запрос, чтобы возвращать все элементы во всех "х" числах категорий, которые, как я думаю/думал, должны быть предложением SELECT и И:

class Item extends EntityRepository
{
    public function findItemsByCategories($categories)
    {

    $qString = 'SELECT j, t, c FROM Technique\Entity\Item j LEFT JOIN j.itemImages t JOIN j.categories c WHERE';

    $i = 0;
    foreach ($categories as $c)
    {
        $qString .= ' c.name = ?' . $i;

        if ($i < (count($categories)-1))
        {
            $qString .= ' AND';
        }
        $i++;
    }

    $query = $this->_em->createQuery($qString);
    $query->setParameters($categories);

    return $query->getResult();
}

В этом маленьком фрагменте кода нет ошибок и выплевывается следующий запрос DQL SELECT (когда в массиве отправляются 2 категории: $categories):

SELECT j, t, c FROM Technique\Entity\Item j LEFT JOIN j.itemImages t JOIN j.categories c WHERE c.name = ?0 AND c.name = ?1

Это всегда возвращает пустой массив, т.е. никаких результатов. Хотя в моей БД есть более 20 элементов, соответствующих критериям: находятся в обеих категориях.

Кто-нибудь видит, что я здесь делаю неправильно? Предполагается, что это выбор И...? В принципе, я просто хотел бы узнать, как запрашивать отношения "многие ко многим" в Doctrine 2+, где должно быть выполнено более одного значения...

4b9b3361

Ответ 1

Для всех, кого это интересует, я понял это (больно). Доктрина должна действительно объяснить это лучше, а не одну строку, которую они имеют на странице DQL....

В основном это не запрос AND, это запрос участника и. Для каждой категории должен быть создан MEMBER OF, а затем добавлен ко всему запросу с AND:

SELECT j, t FROM Entity\Item j LEFT JOIN j.itemImages t WHERE ?0 MEMBER OF j.categories AND ?1 MEMBER OF j.categories AND ?2 MEMBER OF j.categories, etc.

Это вернет все элементы, которые во всех запрошенных категориях.