我正在尝试使用Criteria
过滤Doctrine生成的关联属性,如“学说”手册中所述:Filtering Collections
以下是一些示例代码:拥有多辆汽车的人。为简单起见,我们保存了在汽车实体中购买和出售汽车的日期,而不是创建关联实体。
class Car
{
/**
* @ORM\ManyToOne(targetEntity="Person", inversedBy="cars")
* @ORM\JoinColumn(name="owner_id", referencedColumnName="id", nullable=false)
*/
private $owner;
/**
* @ORM\Column(name="bought", type="date")
*/
private $bought;
/**
* @ORM\Column(name="sold", type="date")
*/
private $sold;
}
class Person
{
/**
* @ORM\OneToMany(targetEntity="Car", mappedBy="owner")
*/
private $cars;
public function __construct
{
$this->cars = new ArrayCollection();
}
/**
* Get cars
*
* @return \Doctrine\Common\Collections\Collection
*/
public function getCars()
{
return $this->cars;
}
public function getCarsOwnedAtDate(\DateTime $date)
{
$allCars = $this->getCars();
$criteria = Criteria::create()->where(
Criteria::expr()->andX(
Criteria::expr()->lte("bought", $date),
Criteria::expr()->gte("sold", $date)
)
);
return $allCars->matching($criteria);
}
}
getCars
的文档说它返回Collection
。请注意,此文档由Doctrine自动生成。
因此,当我使用matching
方法在Collection
上致电getCarsOwnedAtDate
时,我的IDE会发出Collection
没有matching
方法的警告。事实证明,这是对的。
getCars
返回的对象是ArrayCollection
,并且有matching
方法,因此代码运行正常。
我的问题是:我可以依赖Doctrine自动生成的方法总是返回ArrayCollection
的事实吗?或者上述代码在某种情况下是否会失败?如果它总是返回ArrayCollection
,那么为什么PhpDoc评论没有明确提及这个类?