Symfony框架OneToMany关联下如何按图片名或标签名实现搜索
问题原因
你当前的代码存在3个核心问题:
- 模糊匹配用了
=运算符,但是参数加了%通配符,这种场景必须用LIKE关键字才能触发模糊匹配 - 没有添加OR条件匹配关联Tags表的
tag_name字段 - 实体关联配置不匹配,会导致关联查询失效:Image实体中
$tags的OneToMany注解mappedBy值为image,但Tags实体中对应的关联字段名为$imageStock,两者不一致
第一步:修正实体关联配置
先修改Image实体的$tags注解:
/** * @ORM\OneToMany(targetEntity=Tags::class, mappedBy="imageStock", cascade={"persist"}) */ private $tags;
第二步:编写正确的查询代码
直接在ImageRepository中使用如下方法即可:
public function searchByKeyword(string $search_name) { return $this->createQueryBuilder('c') ->leftJoin('c.tags', 't') ->where('c.image_name LIKE :searchTerm') ->orWhere('t.tag_name LIKE :searchTerm') ->distinct() // 避免同一图片匹配多个标签时返回重复结果 ->orderBy('c.id', 'ASC') ->setParameter('searchTerm', "%{$search_name}%") ->getQuery() ->getResult(); }
补充说明
如果不需要保留无标签的图片查询结果,可以把leftJoin换成innerJoin,查询效率会更高。
内容的提问来源于stack exchange,提问作者Demi God
相关产品推荐
相关产品推荐

