我在“员工”和“状态”之间存在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;
}
答案 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()))
);
并在发布新更改时记下更改代码。