【问题标题】:Can't get the right results using the orWhere query in Yii2 framework在 Yii2 框架中使用 orWhere 查询无法获得正确的结果
【发布时间】:2022-01-03 02:14:48
【问题描述】:

我在 Yii2 框架中使用以下代码从包含特定标签的 mySQL 数据库中获取所有结果(在我的例子中是汽车):

$query->orWhere(['and',
            ['car_extra.field_id' => $this->carField->id],
            ['like', 'car_extra.value', $searchValue]
        ]); 

例如,数据库中有 2 辆汽车。

汽车福特包含标签:absdvd-player

汽车 Jeep 包含标签:Parktronic

当我搜索标签 "abs" 时,搜索会显示 福特 车,这没问题,但是当我同时搜索 "abs" strong> 和 "Parktronic" 在前端搜索表单中,搜索返回零结果,因为它在数据库中搜索包含两个标签 "abs" 的单个汽车 “Parktronic”。如何修改上面的代码,以便我可以得到两辆车:福特和吉普?

【问题讨论】:

  • 我们如何确定与您描述的情况相同?您能向我们展示您创建并测试过的实际 RAW 查询吗?连同使用上述查询生成器的查询输出,我假设您正在使用搜索模型
  • 您的汽车没有“abs”和“Parktronic”..所以您的查询应该是“abs”或“Parktronic”...您也可以尝试 IN ("abs", "Parktronic " )

标签: php mysql yii2


【解决方案1】:

我已经使用 yii2 5 个月了,但是查询构建确实是一项艰巨的工作。但这是您可以使用的解决方案。

$query->andWhere(['car_extra.field_id' => $this->carField->id]);

$searchValue=explode(' ',$searchValue);
foreach($searchValue as $searchParam)
{
    $query->orWhere(['like', 'car_extra.value', $searchParam]); 
}

我已将您的搜索参数分解为数组并将其用作单个搜索值。 如果您的搜索查询没有用空格分隔,那么您可以使用 explode(',',$searchValue) 任何东西。

【讨论】:

  • 这样的查询实际上会找到 field_id 匹配或值包含标签之一的所有记录。那是因为orWhere 方法基本上是“(现有条件)或(新条件)”。所以只有一个标签,你会得到类似(car_extra.field_id = :p0) OR (car_extra.value LIKE :p1)的东西。因此,您不会找到至少有一个必需标签和 field_id 匹配的汽车,而是会找到所有 field_id 匹配的汽车和 field_id 不匹配但具有必需标签的汽车。
【解决方案2】:

您可以使用基于 ana 数组的 IN 子句来搜索值

  $myArray = ["abs","Parktronic"]
  $query->where(['in','car_extra.value', $myArray]); 

【讨论】:

  • 注意:如果$myArray 是一个数组,$query->where(['car_extra.value' => $myArray]) 将导致IN 表达式。如果 $searchValue 被预处理为具有单个标记的字符串或具有多个标记的字符串数组,则可用于将整个查询简化为 $query->where(['car_extra.field_id' => $this->carField->id, 'car_extra.value' => $searchValue])
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多