В настоящее время я учусь использовать 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 внутри paranthesis:
$this->news = (clone $criteria)
->filterByType('news')
->find();
Parse error: syntax error, unexpected T_OBJECT_OPERATOR
Вместо этого мы должны присвоить его переменной, прежде чем мы сможем его использовать:
$clonedCritera = clone $criteria;
$this->news = $clonedCriteria
->filterByType('news')
->find();
У вас такое же поведение с оператором new
.Я вижу, что разработчики Propel обошли это ограничение, заменив:
new ArticleQuery()->doOperations()
на ArticleQuery::create()->doOperations()
.
Почему разработчики языка PHP решили сделать это таким образом?Если бы вы могли использовать результат этих выражений напрямую, это сделало бы код более беглым и, в некоторых случаях, более легким для чтения.