【发布时间】:2015-03-02 19:20:53
【问题描述】:
在pagination doc 中,他们正在使用 $countQuery = clone $query;为什么?它在没有克隆的情况下工作,并在结果中产生与克隆相同的 sql 查询。请帮我找出不同之处。
【问题讨论】:
标签: php pagination clone yii2
在pagination doc 中,他们正在使用 $countQuery = clone $query;为什么?它在没有克隆的情况下工作,并在结果中产生与克隆相同的 sql 查询。请帮我找出不同之处。
【问题讨论】:
标签: php pagination clone yii2
clone 相对于创建新对象的优势在于,所有属性都将被复制到新对象中,而不是重置它们。这在您使用查询生成器时非常有用。在官方文档示例中,我们有:
$query = Article::find()->where(['status' => 1]);
$countQuery = clone $query;
如果你从$query 和$countQuery 得到一个转储,你可以看到,$countQuery 是一个新对象,就像$query 一样,它也有status=>1。在这些情况下,我们使用克隆有两个几乎相同的查询,但略有不同。因此,您可以从 Query Object 获得多种行为。当您拥有复杂的查询构建器对象时,这将变得更加有用,您可能需要与现有查询稍有不同。例如,您需要有一个union。您不想重写您的 Query 对象,对吗?因此,最好的方法是从现有查询中获取克隆,然后更改其行为。
【讨论】:
如果你的意思是为什么你应该克隆对象而不是重用它,答案是在对象上调用 count 函数可能会改变它的内部状态。如果您随后重复使用相同的对象,可能会产生意想不到的结果。
【讨论】: