【问题标题】:How to filter out models with null properties in Yii2如何在 Yii2 中过滤掉具有空属性的模型
【发布时间】:2015-06-30 14:19:09
【问题描述】:

在我的应用程序中,我有带有相关翻译的产品实体(不同语言的描述)、配件(产品列表),最后是价格实体。有欧元价格表,美元,澳大利亚和适当的价格条目是通过使用当前价格表ID检索的。

class Product extends \yii\db\ActiveRecord
{
    ...

    public function getPrice()
    {
        $supplier = Supplier::getCurrent();
        return $this->hasOne(ProductPrice::className(), ['IDProduct' => 'IDProduct'])
                    ->onCondition(['PriceListID' => ... getCurrentPricelistID()]);
    }
    ...
}

下面的查询检索具有填充价格、配件和翻译属性的产品条目数组。

$query = Product::find()
   ->where($conditions)
   ->with('translation', 'accessories', 'price')
   ->asArray()
   ->all();

我需要过滤掉价格为空的产品条目。这样一些价目表(例如澳大利亚的价目表)的产品将比其他价目表少,因为有些产品不在该国家/地区销售。我该怎么做?

【问题讨论】:

    标签: database activerecord yii2 relationship


    【解决方案1】:

    试试这个 where 子句:

    $query = Product::find()
    ->where($conditions)
    ->with('translation', 'accessories', 'price')
    ->where(['not', ['price' => null]])
    ->asArray()
    ->all();
    

    【讨论】:

    • 不,它不起作用,因为它尝试在 SQL 未定义列中连接该条件:7 错误:列“价格”不存在第 1 行:SELECT * FROM “tbl_products”WHERE NOT ("价格”为空)
    • 抱歉列的名称如何?
    • 它是ProductPrice (tbl_pricelists.ProductPrice),但它也不起作用。因为 find etc 语句的输出只是 SELECT * FROM "tbl_products" 没有任何连接符号,所以通过将任何字段放在您将查询的位置。无论如何,我刚刚找到了解决方案。
    • @salaros 你为什么将一个不工作的解决方案更改为另一个不工作的解决方案?
    • 在 Yii2 中,您可以使用 DB 关系(通过 get 访问器)定义模型属性。通常它们由一个模型或集合表示。在我的原始查询中,获取所有产品然后延迟填充(我认为 asArray 是触发器)它们的属性。每个关系的结果查询是基于 LEFT JOIN 的(我想),这就是为什么我在我的答案中得到空属性下面我使用了 INNER JOIN 关系,并在每个模型上预先填充了 price 属性(这也是我的假设)+ 过滤掉该 prop 设置为 null 的条目,因为这是 INNER JOIN 关系的工作方式
    【解决方案2】:

    我最终使用innerJoinWith 作为价格属性/关系:

    $query = Product::find() 
        ->with('translation', 'accessories')
        ->innerJoinWith('price')
        ->asArray()
        ->all();
    

    【讨论】:

      猜你喜欢
      • 2018-10-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-01-26
      • 2021-10-29
      • 1970-01-01
      相关资源
      最近更新 更多