选择具有多个关键字的实体

时间:2019-01-13 21:33:01

标签: doctrine query-builder symfony4

我想选择具有至少一个搜索关键字的记录。 关键字存储在一个以逗号分隔的字段中,如下所示:

+--------------------------+
| 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 :(得分:0)

已解决

        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%"] []