具有OneToMany关系的Doctrine ArrayCollection准则

时间:2018-04-05 14:59:40

标签: symfony doctrine-orm criteria

我在“员工”和“状态”之间存在OneToMany单向关系。 那么“员工”和“文件”之间也存在许多关系的双向关系。 当我有一份文件时,我试图找到所有相关员工($ Document-> getEmployees()),然后通过“状态”“过滤”(使用 - >匹配(标准))

我一直收到以下错误:

    2018-04-05T14:35:19+00:00 [error] Error thrown while running command "app:expiration-check". Message: "Notice: Undefined index: Status"

In DefaultQuoteStrategy.php line 39:

  Notice: Undefined index: Status

以下是我正在使用的代码:

$Employees = $Document->getEmployees()->matching(
                Criteria::create()
                    ->andWhere(Criteria::expr()->eq('Status',$this->GlobalSettings->getApprovedEmployeeStatus()))
            );

有趣的是,如果我使用员工存储库

,则完全相同的标准有效
$Employees = $this->em->getRepository(Employee::class)->matching(
                Criteria::create()
                    ->andWhere(Criteria::expr()->eq('Status',$this->GlobalSettings->getApprovedEmployeeStatus()))
            );

匹配静态字段也可以正常工作。

$Employees = $Document->getEmployees()->matching(
                Criteria::create()
                    ->andWhere(Criteria::expr()->eq('FirstName',"Keven"))
            );

这是状态栏定义

/**
 * @ORM\ManyToOne(targetEntity="Entity\Accounts\EmployeeStatus")
 * @ORM\JoinColumn(name="StatusId", referencedColumnName="id", nullable=false)
 */
private $Status;

以下是员工定义(在文档实体上)

/**
 * @ORM\ManyToMany(targetEntity="Entity\Accounts\Employee", mappedBy="Documents")
 */
private $Employees;

/**
 * Constructor
 */
public function __construct()
{
    parent::__construct();
    $this->Employees = new \Doctrine\Common\Collections\ArrayCollection();
}

以下是getEmployees()(也在Document上)

/**
 * Get employees.
 *
 * @return \Doctrine\Common\Collections\Collection
 */
public function getEmployees()
{
    return $this->Employees;
}

1 个答案:

答案 0 :(得分:2)

为了管理 ManyToMany关系,doctrine使用Doctrine\ORM\Persisters\Collection\ManyToManyPersister类。 您可以看到它被使用here

不幸的是,目前在最新版本v2.6.1中,此类的方法 loadCriteria 缺少使用关系字段的功能。仅支持静态字段。

目前查看主分支,已添加此支持:Doctrine\ORM\Persisters\Collection\ManyToManyPersister as of today 但它还不是发布的一部分。同时快速查看2.7 branch它看起来不会出现。

我不确定你是否可以使用symfony的doctrine bundle的master分支。我认为现在很难让它发挥作用。

你可以做什么,初始化ManyToMany集合 $Document->getEmployees()然后使用匹配函数,这意味着你加载所有员工然后过滤,而不是像你期望的那样延迟加载

所以:

$employees = $Document->getEmployees();
$employees->initialize();
$employees->matching(
            Criteria::create()
                ->andWhere(Criteria::expr()->eq('Status',$this->GlobalSettings->getApprovedEmployeeStatus()))
        );

并在发布新更改时记下更改代码。