symfony2过滤相关实体与实体

时间:2016-03-22 05:02:13

标签: php doctrine-orm symfony

我已经搜索谷歌几个小时了,我似乎无法找到我正在寻找的答案。在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()函数。帮助!

1 个答案:

答案 0 :(得分:1)

我发现this question描述了与您类似的问题。 不可能按照您描述的方式使用标准。

所以有三种解决方案:

  1. 获取整个集合,然后按照the question I mentioned earlier中的季节过滤它。

  2. 创建存储库方法以按季节ID获取用户策略。

  3. 首先获取季节,然后在实体存储库的默认findBy()方法中使用它。

  4. 希望这有帮助。