2013-04-24 2 views
1

У меня есть 2 таблицы Doctrine, которые связаны с отношениями ManyToMany.Doctrine 2, ManyToMany search

Таблица: Записи

СТОЛА: теги

Я хотел бы быть в состоянии найти записи, которые имеют несколько или один тег (ы) соответствие каждые тегов, которые я ввод.

Ех: В записи «foo» есть метки «1» и «2». Если я попытаюсь найти все записи по тегу «1», я найду эту запись, если я сделаю другой поиск как «1», так и «2», я снова найду его, но если я добавлю поиск по тегу «3», , то значение не будет соответствовать.

До сих пор я нашел несколько простых методов для реализации такой вещи с помощью OR, но это не дает мне результатов, которые я хочу, и я действительно не знаю, как я мог бы сделать такой поиск с помощью Doctrine 2.

Normaly Я бы использовал таблицу отношений, чтобы сделать это, но я не знаю, возможно ли это в Doctrine.

ответ

1

Не совсем уверен, если я понял, но попробовать, если это работает:

//class EntryRepository 

public function yourFunction($tags) 
{ 
    return $this->createQueryBuilder("o") 
     ->innerJoin("o.Tags", "t", "WITH", "t.name IN :tags") 
      ->setParameter("tags", $tags) 
     ... 
} 

Это будет возвращать записи, которые имеют по крайней мере один из тегов в $ теги массив. Если это то, что вы хотите, вы можете также играть с

->addSelect("COUNT(t.id) as HIDDEN relevance")->groupBy("o.id") 
->orderBy("relevance") 

Это будет возвращать результаты в порядке, сколько тегов совпадают, но я не проверял.

+0

Это для ИЛИ. Он будет соответствовать любым элементам, которые содержат по крайней мере 1 из тегов. То, что я хочу, это AND, который вернет все, у кого есть все теги. Что я имею прямо сейчас, когда работает 1 INNER JOIN за теги. Но я бы искал лучшее решение, если оно существует. (И спасибо за релевантность, собираюсь использовать его где-то еще!) – Manhim

+0

Хорошо, я понял, что вам нужно. afaik, вы не можете сделать это намного проще, использование подзапроса сделает код более нечитаемым. Но даже если вы это сделаете, вы потеряете «orderBy (актуальность)», потому что запрос возвращает результаты, соответствующие всем тегам. – Zeljko

Смежные вопросы