В настоящее время я учусь использовать Propel ORM, и я хочу повторно использовать критерии для двух немного разных запросов:
$criteria = ArticleQuery::create()
->filterByIsPublished(true)
->orderByPublishFrom(Criteria::DESC)
->joinWith('Article.Author')
->keepQuery();
$this->news = $criteria
->filterByType('news')
->find();
$this->articles = $critera
->filterByType('article')
->find();
Однако это не сработает так, как ожидалось, потому что теперь запрос статей будет пытаться найти записи с типом "новости" и "статья", что, конечно, невозможно.
Итак, нам нужно получить клон этого объекта, и то, что мне показалось интуитивно понятным, было просто добавить ключевое слово clone внутри парантеза:
$this->news = (clone $criteria)
->filterByType('news')
->find();
Ошибка синтаксического анализа: синтаксическая ошибка, неожиданный T_OBJECT_OPERATOR
Вместо этого мы должны назначить его в переменную, прежде чем мы сможем ее использовать:
$clonedCritera = clone $criteria;
$this->news = $clonedCriteria
->filterByType('news')
->find();
У вас такое же поведение с оператором new
. Я вижу, что разработчики propel обошли это ограничение, заменив:
new ArticleQuery () -> doOperations ()
на ArticleQuery :: create () -> doOperations ()
.
Почему разработчики языка PHP решили сделать это именно так? Если бы вы могли напрямую использовать результат этих выражений, это сделало бы код более плавным и, в некоторых случаях, более легким для чтения.