gpt4 book ai didi

Yii2 ActiveQuery : is it possible to combine andWhere and orWhere?

转载 作者:行者123 更新时间:2023-12-02 20:03:09 24 4
gpt4 key购买 nike

不确定标题是否完全描述了问题,无论如何,情况如下:假设我有一个如下所示的 ActiveQuery 后代类:

class OrderQuery extends ActiveQuery
{
public function expired() {
$this->andWhere(['<=', 'order.expiresAt', date("Y-m-d H:i:s")]);
return $this;
}

public function cancelled() {
$this->andWhere(['NOT', ['order.cancelled' => null]]);
return $this;
}
}

我想添加一个额外的方法,archived(),来查找过期或取消的订单。

public function archived() {
$this->andWhere(["OR",
['<=', 'order.expiresAt', date("Y-m-d H:i:s")],
['NOT', ['order.cancelled' => null]],
]);
return $this;
}

上面的方法工作正常,但我想知道,是否可以重用现有的方法 expired() 和 cancelled()在新的 archived() 方法中?

<小时/>

或者,换句话说,是否可以组合 andWhere 和 orWhere以某种方式让他们像这样一起工作:

// pseudocode, not a real code!
$this->orWhere([
$this->andWhere([...]),
$this->andWhere([...]),
]);

谢谢!

最佳答案

目前还没有直接的方法来连接多个查询的条件。 GitHub 上已经有一个 feature request为此,但尚未实现。

目前您可以尝试2种解决方案:

  1. 如果您不想重复条件,您可以为它们创建助手:

    private function getExpiredContition() {
    return ['<=', 'order.expiresAt', date('Y-m-d H:i:s')];
    }

    private function getCancelledContition() {
    return ['NOT', ['order.cancelled' => null]];
    }

    public function expired() {
    return $this->andWhere($this->getExpiredContition());
    }

    public function cancelled() {
    return $this->andWhere($this->getCancelledContition());
    }

    public function archived() {
    return $this->andWhere([
    'OR',
    $this->getExpiredContition(),
    $this->getExpiredContition(),
    ]);
    }
  2. 您可以尝试访问$where直接属性并将其合并到一个查询中。

    public function archived() {
    return $this->andWhere([
    'OR',
    (new static())->cancelled()->where,
    (new static())->expired()->where,
    ]);
    }

关于Yii2 ActiveQuery : is it possible to combine andWhere and orWhere?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49938315/

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