как искать несколько тегов в доктрине - PullRequest
0 голосов
/ 06 июля 2010

У меня есть база данных со связями «многие ко многим» по тегу и человеку. У меня проблемы с поиском человека с несколькими тегами. Я пытался это, но это не удалось:

        $person = Doctrine_Query::create()
        ->from("Model_Person p")
        ->innerJoin("p.tags t")
        ->whereIn('t.id',$t)
        ->execute();

Вышеприведенный оператор возвращает всех людей, у которых есть хотя бы один из тегов в массиве $ t, но я хочу, чтобы только тот, у кого были 'все' теги в этом массиве.

Кто-нибудь знает, как этого добиться?

Спасибо

Ответы [ 2 ]

1 голос
/ 06 июля 2010

Это потому, что IN возвращает все результаты как минимум с одним совпадением.Скажем, если у вас есть id IN(1,2,3), это то же самое, что и id = 1 OR id = 2 OR id = 3.

. Чтобы достичь желаемой цели, используйте метод Doctrine andWhere() с каждым значением, которое теперь находится в $t, например[...]->andWhere('id = ?', 1)->andWhere('id = ?', 2)->[...]

0 голосов
/ 30 ноября 2011

После некоторого времени исследований я нашел и принял чистый код SQL, который работает именно так, как мне нужно.В моем приложении таблица person от rizidoro равна info table.

   //$tagQueryString contains tags separated by space ex. "crisis usa"    
   $tagsArray = explode(' ', $tagQueryString);
   $tagsArrayQuery = '"' . implode('","', $tagsArray) . '"';
   //$tagsArrayQuery='"crisis","usa";


    $fromQuery =
            '
        info i
   INNER JOIN (SELECT   it.info_id
               FROM     info_tag it
                        INNER JOIN info i
                          ON i.id = it.info_id
                        INNER JOIN tag t
                          ON t.id = it.tag_id
               WHERE    t.name IN (' . $tagsArrayQuery . ')
               GROUP BY it.info_id
               HAVING   COUNT(it.info_id) = ' . count($tagsArray) . ') ii
     ON i.id = ii.info_id';

    $query = new Doctrine_RawSql();
    $query->select('{i.*}');
    $query->from($fromQuery);
    $query->addComponent('i', 'Model_Info i');

  //you can add offset and limit for pagination
    $infos = $query->limit($resultsPerPage)
                   ->offset($resultsPerPage * ($currentPage - 1))
                   ->execute();

Это не элегантный код, но работает нормально.Я понятия не имею, как сделать это более «доктриноподобным».Вот другие решения подобных проблем: http://www.sergiy.ca/how-to-write-many-to-many-search-queries-in-mysql-and-hibernate

...