我正在尝试在原始实体中为加入实体的学说集合中的特定项目创建简单的吸气剂方法。

主要实体看起来像这样:

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();


在文件中,实体类型字段会告诉我它是哪种文件(图像,声音,视频,演示等...)
当我希望打印出所有产品的列表并在产品详细信息旁边显示图像时,问题就来了,我不希望遍历显示的每个产品的产品文件。

是否可以在产品实体上创建一些简单的吸气剂来获取某种类型的文件?
或者也许为此创建更复杂的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/

10-16 08:13