我已经搜索谷歌几个小时了,我似乎无法找到我正在寻找的答案。在Symfony2中,我试图使用Criteria :: create()并过滤一个季节而不能正常工作。以下是完整的解释:
我有4个实体:用户,用户策略,角色和季节。 UserPolicy实现RoleInterface,User实现UserInterface。
User.php
class User implements UserInterface, \Serializable {
/**
* @OneToMany(targetEntity="UserPolicy", mappedBy="User", cascade={"persist", "remove"})
*/
private $Polocies;
}
UserPolicy.php
class UserPolicy Implements RoleInterface
{
/**
* @Id()
* @Column(type="integer")
* @GeneratedValue(strategy="AUTO")
*/
private $id;
/**
* @ManyToOne(targetEntity="User", inversedBy="Polocies")
* @JoinColumn(name="userid", referencedColumnName="id")
*/
private $User;
/**
* @ManyToOne(targetEntity="Role")
* @JoinColumn(name="roleid", referencedColumnName="id")
*/
private $Role;
/**
* @ManyToOne(targetEntity="Season")
* @JoinColumn(name="seasonid", referencedColumnName="id")
*/
private $Season;
}
Role.php
class Role{
/**
* @Id
* @Column(type="integer")
* @GeneratedValue(strategy="AUTO")
*/
private $id;
/**
* @Column(name="role", type="string", length=50)
*/
private $Role;
/**
* @Column(name="label", type="string", length=50)
*/
private $Label;
/**
* @ManyToOne(targetEntity="Role")
* @JoinColumn(name="parentId", referencedColumnName="id", nullable=true)
*/
private $Parent;
}
注意UserPolicy上的$ Season变量。
每年都会有一个新的季节,用户将获得一套新的政策,保持以前的季节政策。
在User.php中,我需要调用getRoles(),它可以运行,我可以获得附加了角色的UserPolicies,这也是有效的。
当我需要过滤季节时会引入问题。我找到了Criteria类:
$criteria = Criteria::create()
->where(Criteria::expr()->eq("Season", "1"));
但因为季节是一个对象,我得到了错误
Cannot match on AppBundle\Entity\UserPolicy::Season with a non-object value. Matching objects by id is not compatible with matching on an in-memory collection, which compares objects by reference.
如果我不能在用户实体中加载其他数据,如何获取季节对象?我不知道如何通过季节对象。我甚至创建了一个访问季节对象的服务,但我无法访问实体内的get()函数。帮助!
答案 0 :(得分:1)
我发现this question描述了与您类似的问题。 不可能按照您描述的方式使用标准。
所以有三种解决方案:
获取整个集合,然后按照the question I mentioned earlier中的季节过滤它。
创建存储库方法以按季节ID获取用户策略。
首先获取季节,然后在实体存储库的默认findBy()
方法中使用它。
希望这有帮助。