Che*_*ker 5 php propel fluent-interface fluent
我目前正在学习使用Propel ORM,我想重用一个critera用于两个稍微不同的查询:
$criteria = ArticleQuery::create()
->filterByIsPublished(true)
->orderByPublishFrom(Criteria::DESC)
->joinWith('Article.Author')
->keepQuery();
$this->news = $criteria
->filterByType('news')
->find();
$this->articles = $critera
->filterByType('article')
->find();
Run Code Online (Sandbox Code Playgroud)
但是,这不会按预期工作,因为现在对文章的查询将尝试查找类型为"新闻"和"文章"的条目,这当然是不可能的.
所以我们需要得到这个对象的克隆,对我来说似乎直观的是简单地在paranthesis中添加clone关键字:
$this->news = (clone $criteria)
->filterByType('news')
->find();
Run Code Online (Sandbox Code Playgroud)
Parse error: syntax error, unexpected T_OBJECT_OPERATOR
相反,我们必须先将它分配给变量才能使用它:
$clonedCritera = clone $criteria;
$this->news = $clonedCriteria
->filterByType('news')
->find();
Run Code Online (Sandbox Code Playgroud)
您与new运营商具有相同的行为.我看到推进开发者通过替换:
new ArticleQuery()->doOperations()with来规避这个限制ArticleQuery::create()->doOperations().
为什么PHP语言设计者选择这样做?如果你可以直接使用这些表达式的结果,它将使代码更流畅,在某些情况下,更容易阅读.