我试图在原始实体中创建简单的getter方法,用于加入实体的学说集合中的特定项目。
主实体看起来像这样:
class Product
{
/**
* @var integer
*
* @ORM'Column(name="id", type="integer")
* @ORM'Id
* @ORM'GeneratedValue(strategy="AUTO")
*/
private $id;
...
/**
* @ORM'OneToMany(targetEntity="File", mappedBy="product")
*/
private $files;
}
合并实体:
class PrankFile
{
/**
* @var integer
*
* @ORM'Column(name="id", type="integer")
* @ORM'Id
* @ORM'GeneratedValue(strategy="AUTO")
*/
private $id;
/**
* @ORM'ManyToOne(targetEntity="Product", inversedBy="files")
* @ORM'JoinColumn(name="product_id", referencedColumnName="id", onDelete="CASCADE")
*/
protected $product;
/**
* @var string
*
* @ORM'Column(name="type", type="string", length=16)
*/
private $type;
...
我的DQL在存储库类是非常简单的:
return $this->getEntityManager()
->createQuery('SELECT p, f FROM AppProductBundle:Product p INNER JOIN p.files f ORDER BY p.created DESC')
->setMaxResults($limit)
->getResult();
在文件实体类型字段告诉我它是什么类型的文件(图像,声音,视频,演示等…)当我希望打印出所有产品的列表并在产品详细信息旁边显示图像时,问题就来了,我不愿意为显示的每个产品循环遍历产品文件。
是否有可能在产品实体上创建一些简单的getter来获取特定类型的文件?或者最好为此创建更复杂的DQL查询,如何做到这一点呢?
我不能仅仅从DQL文件中获取图像记录,因为我需要某些产品的所有文件。
可以使用filter api直接对集合进行过滤。如果集合尚未加载,Doctrine将在SQL级别应用您的筛选器,从而为您提供最大的性能。如果集合已经是动态加载的,Doctrine将过滤内存中的ArrayCollection
。
use Doctrine'Common'Collections'Criteria;
class Product
{
public function getFilesByType($type)
{
$criteria = Criteria::create()
->where(Criteria::expr()->eq("type", $type))
return $this->files->matching($criteria);
}
}