我第一次使用Criteria元素,但我认为这很简单,我不应该遇到任何问题。当然,出现了一个问题。
我有一个像这样定义的OneToMany关系:
/**
* @ORM\OneToMany(targetEntity="ExpedientesMensajes", mappedBy="expediente", cascade={"remove"})
* @ORM\JoinColumn(name="id", referencedColumnName="id_expediente")
*/
private $mensajes;
每个人都有另一种关系,这个:
/**
* @ORM\OneToMany(targetEntity="ExpedientesMensajesLeidos", mappedBy="mensaje")
* @ORM\JoinColumn(name="id", referencedColumnName="id_mensaje")
*/
private $mensajesLeidos;
现在,在具有第一关系的实体中,我有这个方法:
function isLeidoPor($idControlAcceso = null)
{
// http://doctrine-orm.readthedocs.org/en/latest/reference/working-with-associations.html#filtering-collections
$criteria = Criteria::create()
->where(Criteria::expr()->eq('idControlAcceso', $idControlAcceso))
->setMaxResults(1);
// El expediente es leído si hay mensajes...
if (0 < count($this->getMensajes())) {
// y todos han sido leidos por el control de acceso que pasamos.
// (No se puede usar un Criteria para campos en los campos de los miembros de la colección.)
foreach ($this->getMensajes() as $mensaje) {
$mensaje->getMensajesLeidos()[0];
if (0 == count($mensaje->getMensajesLeidos()->matching($criteria))) {
return false;
}
}
return true;
}
迭代第一个关系的所有元素,并在每个元素上使用定义的条件,从第二个关系中获取元素集合的子集。
当第一个关系 $ mensajes 只是它的一个元素时。但是,当该集合大于该集合时,例如三个元素, matching()方法返回一个空数组,即使我在数据库中看到有符合要求的元素
我已经能够开始工作了
$mensaje->getMensajesLeidos()[0];
在匹配()方法之前,但是AFAIK,我认为这会抛弃使用Criteria元素的全部好处,因为它初始化了集合。在调试并向调试器询问第一个元素时,我看到它也正常工作,这与指令的作用相同。
有人知道这里发生了什么吗?
提前致谢。
答案 0 :(得分:0)
我重写了你的代码,以便不要使用相同的Criteria几次。也许问题来自重用它但不确定。
$criteria = Criteria::create()
->where(Criteria::expr()->eq('idControlAcceso', $idControlAcceso))
->setMaxResults(1);
// We get an array with number of leidos for each mensaje
$mappedOccurrencies = $this
->getMensajes()
->map(function(ExpedientesMensajes $mensaje) use ($criteria) {
$mensaje
->getMensajesLeidos()
->matching($criteria)
->count();
});
// Then if we have at least a mensaje with 0 leidos, we return false (true otherwise)
return !in_array(0, $mappedOccurrencies);