gpt4 book ai didi

mysql - 如何使用查询生成器基于实际字段中的表进行条件 mysql 左连接

转载 作者:行者123 更新时间:2023-11-29 15:27:49 28 4
gpt4 key购买 nike

设置产品时,我可以选择将其可用性限制为客户所在的国家、地区和城市。基于此,我只向系统中符合此条件的相关客户展示产品。

在某些情况下,我想仅将产品设置为国家/地区并忽略城市,我想知道如何最好地编写此查询。

在我看来,我有两个选择。

  1. 如果产品与所有城市和地区相关,只需将它们全部包含在内(大量数据)。
  2. 如果不需要城市/地区,只需忽略限制它们的声明即可。

产品:

+---------------------+------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+---------------------+------------------+------+-----+---------+----------------+
| id | int(10) unsigned | NO | PRI | NULL | auto_increment |
| uuid | binary(16) | NO | UNI | NULL | |
+---------------------+------------------+------+-----+---------+----------------+

多对多加入到位置

+------------------+------------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+------------------+------------------+------+-----+---------+-------+
| product_id | int(10) unsigned | NO | PRI | NULL | |
| meta_location_id | int(11) | NO | PRI | NULL | |
+------------------+------------------+------+-----+---------+-------+

地点

+-------------+---------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------------+---------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| iso | varchar(50) | YES | | NULL | |
+-------------+---------------+------+-----+---------+----------------+

查询生成器代码

$qb = $this->repository->createQueryBuilder('product');
$qb->orderBy('product.id', 'ASC');

//If we are limiting by country
if (isset($options['country']) and null !== $options['country']) {
$qb->andWhere('product.country = :country')
->setParameter('country', $options['country']);
}

地区/城市:

区域选项是客户当前的区域,无论如何都会发送,我无法控制它。由于我正在产品表中搜索,因此我需要检查产品区域是否存在。如果确实如此,那么我必须将其限制在现有区域,否则忽略它。

当前查询:对于此查询,如果区域不匹配,则不会列出产品。我想将其更改为仅适用于产品表中存在数据的条件。

   if (isset($options['region']) and null !== $options['region']) {
$qb->leftJoin('product.regions', 'region');
->andWhere(($qb->expr()->in('region', [$options['region']])));
}

我猜我需要类似的东西

    $qb->add('select', 'CASE WHEN region.id IS NOT NULL then do some query...

任何想法将不胜感激!

最佳答案

这就是我解决这个问题的方法。

而不是做一些复杂的事情,比如试图弄清楚连接是否包含数据。我只是在元位置表中创建了一个虚拟行。

我们的加入现在看起来像这样:

  if (isset($options['region']) and null !== $options['region']) {
$qb->leftJoin('product.regions', 'region');
->andWhere(($qb->expr()->in('region', [12345, $options['region']])));
}

其中 12345 是虚拟行的 ID。

设置产品时,在表单下拉菜单中,我有一个名为“任何”的项目,这意味着客户居住在哪个区域并不重要,就像任何区域一样。

现在,如果选择了任何一个,则连接将有效,否则,如果该区域与实际区域匹配,则它也有效。

好了,我们知道了,通常最简单的解决方案就是最好的!

关于mysql - 如何使用查询生成器基于实际字段中的表进行条件 mysql 左连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58948996/

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