Выберите объекты с несколькими ключевыми словами - PullRequest
0 голосов
/ 14 января 2019

Я хочу выбрать записи, в которых есть хотя бы одно из искомых ключевых слов. Ключевые слова хранятся в одном поле, разделенном запятой, например:

+--------------------------+
| keywords                 |
+--------------------------+
|symfony,html,css,php,ajax | 
+--------------------------+
|symfony,php,linux,c++     | 
+--------------------------+

Предполагается, что пользователь ищет следующие ключевые слова: symfony и html

Запрос должен вернуть эти две строки выше, потому что ключевое слово symfony существует в двух строках, но возвращает только первое поле с ключевыми словами ведьмы, содержащее эти два ключевых слова

    var_dump of $data['keywords']
    string(12) "symfony,html"

А это запрос

    if (!empty($data['keywords'])) {
        $keys = explode(',', $data['keywords']);
        foreach ($keys as $key)
        {
            $qb->andWhere('j.keywords like :keyword');
            $qb->setParameter("keyword", '%'.$key.'%');
        }
    }

1 Ответ

0 голосов
/ 14 января 2019

решаемые

        if (!empty($data['keywords'])) {
        $keywords = explode(',', $data['keywords']);
        $array = "";
        foreach (array_slice($keywords, 1) as $key => $value) {
            $array .= ' or j.keywords like :k' . $key;
            $qb->setParameter('k' . $key, '%' . $value . '%');
        }
        $qb->andWhere('j.keywords like :keyword ' . $array);
        $qb->setParameter("keyword", '%' . $keywords[0] . '%');
    }

и вот как выглядит запрос в журнале

AND (j0_.keywords LIKE ? OR j0_.keywords LIKE ? OR j0_.keywords LIKE ? OR j0_.keywords LIKE ?) [2,"%symfony%","%html%","%test non existent keyword%"] []
...