我试图在原始实体中为已加入实体的学说集合中的特定项目创建简单的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中的文件中获取图像记录,因为我需要某些产品的所有文件。
欢迎任何帮助。
答案 0 :(得分:3)
您可以使用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);
}
}