Здесь в документация по нумерации страниц они используют $ countQuery = clone $ query; Зачем? Он работает без клонирования и выдает те же SQL-запросы, что и клон. Помогите мне найти разницу, пожалуйста.
Преимущество клон После создания нового объекта все свойства будут скопированы в новый объект вместо их сброса. Это очень полезно, когда вы используете конструктор запросов. В примере с официальным документом мы имеем:
$query = Article::find()->where(['status' => 1]);
$countQuery = clone $query;
Если вы получаете дамп из $query
а также $countQuery
ты можешь видеть, $countQuery
это новый объект, так же, как $query
и это также status=>1
, В этих случаях мы используем клон, чтобы иметь два почти идентичных запроса с небольшими отличиями. Таким образом, вы можете иметь несколько поведения от Query Object
, Это станет более полезным, если у вас есть сложные объекты построителя запросов, которые могут вам понадобиться, чтобы немного отличаться от существующего запроса. Например, вам нужно иметь union
, Вы не хотите переписать свой Query
объект, а ты? Поэтому лучшим способом было бы получить клон из существующего запроса, а затем изменить его поведение.
Если вы имели в виду, почему вы должны клонировать объект, а не использовать его повторно, ответ заключается в том, что вызов функции count для объекта может изменить его внутреннее состояние. Если вы снова используете тот же объект, это может привести к неожиданным результатам.