gpt4 book ai didi

mysql - Doctrine2 查询(Builder)在使用 "where"和 "in"子句后丢失关系

转载 作者:行者123 更新时间:2023-11-29 12:09:23 27 4
gpt4 key购买 nike

我有两个实体,我们称它们为“女孩”和“特征”。实体“Girl”与“Feature”处于无向多对多关系。

我有一个带有简单搜索表单的页面。我想按特征搜索女孩。在服务器端提交表单后,我得到的是功能 ID 列表,而我应该返回的是选择了列出的功能的女孩列表以及该女孩拥有的所有其他功能

让我们看看这个:
╔════════════╦═══════════════╦══════════ ═════╦════ ═══════════╗
║ ║ (1) 特征 1 ║ (2) 特征 2 ║ (3) 特征 3 ║
╠════════════╬═══════════════╬══════════ ═════╬════ ═══════════╣
║ (1) 女孩 1 ║ 是 ║ 是 ║ 否 ║
║ (2) 女孩 2 ║ 是 ║ 否 ║ 是 ║
╚════════════╩═══════════════╩══════════ ═════╩════ ═══════════╝

括号中的数字是实体 ID。

我首先做的是:

$qbd = $this->getQbd('AppBundle:Girl', 'g')
->select('g, gf')
->leftJoin('g.features', 'gf');

从 URL 获取数据(功能 ID)(因为表单使用 GET 方法)并将它们放入 $features 数组中后,我执行如下操作:

if (!empty($features)) {
$qbd->where(
$qbd->expr()->in('gf.id', ':features')
)->setParameter('features', $features);
}

尽可能简单。

一切都很好。几乎。

当我尝试搜索 Features id 等于 2 和 3 的 Girls 时,我得到的结果都是 Girls(这很好)。遗憾的是,它们中的每一个都只有功能 2 和 3(对于本例;当我尝试为它们中的每一个执行 $girl->getFeatures() 时),即使它们都应该包含对功能 1 的引用。

我做错了什么?我已经尝试为这种情况构建其他更复杂的查询,但每个查询最后我都遇到了同样的问题。

最佳答案

您可以使用“MEMBER OF”DQL 构造。

例如,您可以这样做:

$qb->from('AppBundle:Girl', 'g')
->select('g')
->andWhere(':feature MEMBER OF g.features')
->setParameter('feature', $feauture);

缺点是它只能使用单一功能。例如,如果你需要让女孩具有特征 A 和 B,你需要这样做:

$qb->from('AppBundle:Girl', 'g')
->select('g')
->andWhere(':featureA MEMBER OF g.features')
->setParameter('featureA', $featureA)
->andWhere(':featureB MEMBER OF g.features')
->setParameter('featureB', $featureB);

这是我所知道的在集合中搜索某些实体的最简洁的方法。但是,如果您需要搜索某个具有许多相关实体(功能)的实体(女孩),那么使用这种方法您将面临一些性能问题。在这种情况下,也许最好使用子查询。

关于mysql - Doctrine2 查询(Builder)在使用 "where"和 "in"子句后丢失关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30948062/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com