我想开始使用Criteria
,但我有一个非常基本的问题,我找不到任何有关的信息。
假设我有一个拥有方法getStudents
的实体。此方法可以返回ArrayCollection
或PersistentCollection
,两者都来自matching
接口的Selectable
方法。问题是,我应该将提示键入什么作为getStudents
方法的返回值?在我看到的任何地方,人们建议使用Collection
接口作为类型提示,这两个类共享,但此接口不扩展Selectable
,因此它没有{{1 }} 方法!所以看起来有些不一致。
在许多教程中,例如here,我们有类似的内容:
matching
但如果public function getExpertScientists()
{
$criteria = Criteria::create()
->andWhere(Criteria::expr()->gt('yearsStudied', 20))
->orderBy(['yearsStudied', 'DESC']);
return $this->getGenusScientists()->matching($criteria);
}
是没有匹配方法的类型提示$this->getGenusScientists()
,它会在我的IDE中生成警告,并且感觉有些不对。
你是如何处理的?除了忽略IDE警告或输入我们的getter可以返回的所有内容(例如:Collection
)之外,我们还有其他选择吗?
答案 0 :(得分:0)
不确定是否有其他IDE,所以我将回答PHPStorm。
我一直使用@return Collection|Selectable
,效果很好。
如果该方法返回例如Student
个实体,您也可以输入为。
@return Collection|Selectable|Student[]
因此IDE可以理解Doctrine Collections的所有内容,但是如果您稍后对其进行迭代或访问单个元素,它也可以键入提示Student
的方法。
当然,从语义上讲这没有多大意义,因为您期望的是类似@return Collection&Selectable&Student[]
的东西,因为您返回的是交集类型而不是联合类型。
从PHPStorm 2018.3版本开始,实际上甚至可以使用交集类型(请参见this update),因此@return Collection&Selectable&Student[]
可以工作,这有助于您在代码中区分实际的联合和交集类型。 / p>