我正在尝试在原始实体中为联合实体的学说集合中的特定项目创建简单的 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);
}
}
关于php - 为联合学说 2 集合实现 setter/getter ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25222746/