首页 > 解决方案 > Yii Query DB when `where` 有时可以是全部(*)(必要时省略一个或多个 where 子句)

问题描述

当一个或多个 where 条件有时可以“获取所有”时,具有多个 where 条件的 Yii 查询,如 *

我尝试完全像这样省略相关的状态子句,但这显然破坏了代码。

$orders = Orders::find()
 ->where(['currency' => $filterCurrency])
if ($filterStatus !== null){
 ->where(['status' => $filterStatus])    
}
->all();

当前代码:

$filterCurrency = 'eur';
$filterStatus = null; // but can e.g. be 'Draft'

$orders = Orders::find()
 ->where(['currency' => $filterCurrency, 'status' => $filterStatus])
 ->all();

我正在寻找一个结果,如果 eg$filterStatus的值为*,那么理想情况下它根本不会包含在查询中,因此根本不会使状态列成为查询的一部分。

标签: databasewhere

解决方案


这应该这样做。关键是将其分解为查询并andWhere仅在必要时使用。

$filterCurrency = 'eur';
$filterStatus = null; // but can e.g. be 'Draft'

$ordersQuery = Orders::find()
  ->where(['currency' => $filterCurrency]);

if ($filterStatus != '*') {
  $ordersQuery->andWhere(['status' => $filterStatus]);
}

$orders = $ordersQuery->all();

推荐阅读