2016-01-15 55 views
1

我有一个奇怪的Symfony/Doctrine错误。 我的实体结构是这样的存储库方法并不总是给出预期的结果

class ClassA { 

/** 
* @ORM\ManyToOne(targetEntity="My\CoreBundle\Entity\ClassB", inversedBy="classAs", cascade={"persist"}) 
* @ORM\JoinColumn(nullable=false) 
*/ 
private $classB; 

} 

class ClassB { 

/** 
* @ORM\OneToMany(targetEntity="My\CoreBundle\Entity\ClassA", mappedBy="classB", cascade={"persist", "remove"}) 
*/ 
private $classAs; 

/** 
* @ORM\ManyToOne(targetEntity="My\CoreBundle\Entity\ClassC", inversedBy="classBs") 
* @ORM\JoinColumn(nullable=false) 
*/ 
private $classC; 

} 

class ClassC { 

/** 
* Inverse Side 
* @ORM\OneToMany(targetEntity="My\CoreBundle\Entity\ClassB", mappedBy="classC", cascade={"persist", "remove"}) 
*/ 
private $classBs; 

/** 
* Inverse Side 
* @ORM\OneToMany(targetEntity="My\CoreBundle\Entity\ClassD", mappedBy="classCs", cascade={"persist", "remove"}) 
*/ 
private $classDs; 

} 

class ClassD { 

/** 
* @ORM\ManyToOne(targetEntity="My\CoreBundle\Entity\ClassC", inversedBy="classDs") 
* @ORM\JoinColumn(nullable=false) 
*/ 
private $classC; 

} 

我知道,在ClassA的(ID = 566208)连接到D类(ID = 16286)的数据库。

我在ClassARepository中有这个非常简单的方法。

class ClassARepository extends EntityRepository 
{ 
    public function myMethod() 
    { 
     $builder = $this->createQueryBuilder('classA'); 
     $query = $builder->getQuery(); 

     $classAs = $query->getResult(); 

     echo "<pre>"; 
     foreach ($classAs as $classA) { 
      if ($classA->getId() == 566208) 
      { 
       echo "classA 566208\n"; 
       $classDs = $classA->getClassB()->getClassC()->getClassDs(); 
       $found = false; 
       foreach ($classDs as $classD) { 
        if (16286 == $classD->getId()) { 
          $found = true; 
          echo "INFO 16286 found\n"; 
        } 
       } 
       if (false == $found) echo "ERROR 16286 Not found\n"; 
      } 
     } 
     echo "</pre>"; 
    } 
} 

当我调用此方法在控制器中没有问题

class MyController 
{ 
    public function indexAction() 
    { 
     $this->getRepository('MyCoreBundle:ClassA')->myMethod(); 

    // [...] 
    } 
} 

结果是

classA 566208 
INFO 16286 found 

但在码的其他部分

class MyService 
{ 
    private function myServiceMethod() 
    { 
     $this->doctrine->getManager() 
         ->getRepository('MyCoreBundle:ClassA')->myMethod(); 
    } 
} 

结果是

classA 566208 
ERROR 16286 Not found 

这是什么原因造成的?我有点困惑,不知道我的教义是否可靠。

我的配置 “PHP”: “> = 5.5”, “的symfony/symfony中”: “2.8 *”, “学说/ ORM”: “〜2.5”,

我做了mysqlcheck的一切似乎都好。

编辑/ TLDR:

此代码...

echo "<pre>"; 
echo "NORMAL\n"; 
$classC = $this->doctrine->getManager()->getRepository('MyCoreBundle:ClassC')->find(7); 
$classDs = $classC->getClassDs(); 
$found = false; 
foreach ($classDs as $classD) { 
    if (16286 == $classD->getId()) { 
      $found = true; 
      echo "INFO 16286 found\n"; 
    } 
} 
if (false == $found) echo "ERROR 16286 Not found\n"; 

echo "INVERSED\n"; 
$classDs = $this->doctrine->getManager()->getRepository('MyCoreBundle:ClassD')->findBy(array("classC" => 7)); 
$found = false; 
foreach ($classDs as $classD) { 
    if (16286 == $classD->getId()) { 
      $found = true; 
      echo "INFO 16286 found\n"; 
    } 
} 
if (false == $found) echo "ERROR 16286 Not found\n"; 
echo "</pre>"; 

...给...

NORMAL 
ERROR 16286 Not found 
INVERSED 
INFO 16286 found 

回答

1

问题是查询是在服务myMethod调用和Doctrine放入这些查询的一些子部分之前执行的。

解决方案是要求实体管理器清除其缓存。

$this->doctrine->getManager()->clear(); 
$this->doctrine->getManager() 
        ->getRepository('MyCoreBundle:ClassA')->myMethod(); 
0

如果你永远只能查询这个ID,你如果不需要,不必循环遍历每个表格记录。事情是这样的:

$this->doctrine->getManager->getRepository->('MyCoreBundle:ClassA')->find(16286)

效率要高得多。您可以从存储库中选择entityManager并获取classC的存储库,并直接使用id查询该存储库。

你确定没有什么改变两个方法调用之间的关系吗?

即时使用学说一段时间现在和也在生产,但我还没有这样的问题呢。

+0

不,我需要在所有ClassA的对象循环,但我找到了失踪了这个特定的ID 566208。我不知道其他对象是否有同样的问题。 – moins52

+0

2个方法调用之间没有任何变化。 – moins52

相关问题