我有一些条令实体,每个实体都有一对多关系:第一个:基础,第二个:模块,第三个:模块细节(详见下文)。这个设置非常有效。当获取一个基础时,我会获取所有模块和相关的详细信息。
我的问题是:模块的细节可能会随着时间的推移而变化,因此每当细节发生变化时,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);