Symfony2学说过滤集合


Symfony2 doctrine filter collections

我有一些条令实体,每个实体都有一对多关系:第一个:基础,第二个:模块,第三个:模块细节(详见下文)。这个设置非常有效。当获取一个基础时,我会获取所有模块和相关的详细信息。

我的问题是:模块的细节可能会随着时间的推移而变化,因此每当细节发生变化时,DB中就会有一个新条目,并相应地设置修订日期。

现在我想创建一个包含所有模块和详细信息的Base,但只有最新版本的详细信息(或我选择的任何版本),但我对此感到困惑!

我可以为moduleDetails编写一个自定义的getter方法吗?该方法只获取与给定条件匹配的方法?我已经读过关于Critera Class的学说,但无法将其付诸实践。欢迎任何帮助或提示。提前非常感谢!

例如,这里是我的实体(简而言之):

基本实体

/**
 * @ORM'Entity(repositoryClass="hcs'AlphaBundle'Entity'OfferBaseRepository")
 * @ORM'Table(name="hcs_offerbase")
 * @ORM'HasLifecycleCallbacks
 *
 * @ExclusionPolicy("all")
 */
class OfferBase
{
    /**
      * @ORM'Column(type="integer")
      * @ORM'Id
      * @ORM'GeneratedValue(strategy="AUTO")
      * @Type("integer")
      * @SerializedName("id")
      * @Groups({"list", "detail"})
      *
      * @Expose
    */
    protected $id;
    /**
      * @ORM'OneToMany(targetEntity="ModuleBase", mappedBy="offerbase", cascade={"persist", "merge"})
      * @Type("ArrayCollection<hcs'AlphaBundle'Entity'ModuleBase>")
      * @Assert'Valid
      *
      * @Expose
    */
    protected $category;

模块实体:

/**
 * @ORM'Entity(repositoryClass="hcs'AlphaBundle'Entity'ModuleBaseRepository")
 * @ORM'Table(name="hcs_modulebase")
 *
 * @ExclusionPolicy("all")
 */
class ModuleBase
{
    /**
      * @ORM'Column(type="integer")
      * @ORM'Id
      * @ORM'GeneratedValue(strategy="AUTO")
      * @Type("integer")
      * @SerializedName("id")
      *
      * @Expose
    */
    protected $id;
    /**
      * @ORM'ManyToOne(targetEntity="OfferBase", inversedBy="category")
      * @ORM'JoinColumn(name="offerbase_id", referencedColumnName="id")
    */
    protected $offerbase;
    /**
      * @ORM'OneToMany(targetEntity="ModuleCondition", mappedBy="modulebase", cascade={"persist", "merge"})
      * @Type("ArrayCollection<hcs'AlphaBundle'Entity'ModuleCondition>")
      * @Assert'Valid
      *
      * @Expose
    */
    protected $modules;

模块详细信息实体

/**
 * @ORM'Entity(repositoryClass="hcs'AlphaBundle'Entity'ModuleConditionRepository")
 * @ORM'Table(name="hcs_modulecondition")
 * @ORM'HasLifecycleCallbacks
 *
 * @ExclusionPolicy("all")
 */
class ModuleCondition
{
    /**
      * @ORM'Column(type="integer")
      * @ORM'Id
      * @ORM'GeneratedValue(strategy="AUTO")
      * @Type("integer")
      * @SerializedName("id")
      *
      * @Expose
    */
    protected $id;
    /**
      * @ORM'ManyToOne(targetEntity="ModuleBase", inversedBy="modules")
      * @ORM'JoinColumn(name="modulebase_id", referencedColumnName="id")
    */
    protected $modulebase;

2015年2月12日编辑坦克供您评论:

@威尔特:我尝试了你在回答中提出的建议(出于测试目的,我使用id作为标准):

所以在我的模块实体中,我做了:

   /**
     * Get modules
     *
     * @return 'Doctrine'Common'Collections'Collection 
     */
    public function setModules()
    {
        $criteria = Criteria::create()
          ->where(Criteria::expr()->gte('id', '1'));
          return $this->details->matching($criteria);
    }

但考虑到你的回答,我想我错了。从数据库中获取整个实体后,我必须在我的控制器中使用这个过滤器,然后过滤集合。

我说得对吗?

如果我这样做,是否有可能使用过滤后的集合对实体进行序列化?我使用JMS序列化程序。

@概述这用于REST Api。您可以通过发送id(offerbase_id)来获取任何报价,并获得序列化报价及其所有详细信息:

$currentOffer = $this->getDoctrine()->getRepository('myBundle:OfferBase')->find($offerId);
$serializer = $this->get('jms_serializer');
$result = $serializer->serialize($currentOffer, 'json');
return new Response($result);

作为普通用户,您只能访问最新版本的产品,但如果您的user_role允许,您可以访问所有版本。我无法在客户端进行筛选。

条令文档中有一整段关于如何做到这一点的内容8.8过滤器集合

您可以使用Doctrine'Common'Collections'Criteria类,并使用修订日期添加筛选集合的条件。

这样的东西:

$criteria = Criteria::create()
    ->where(Criteria::expr()->gte('revision_date', $date));
return $this->details->matching($criteria);