奇怪而恼人的问题:
在OneToMany关系上使用leftJoin的简单Doctrine查询返回(并且更精确地映射)只有一行已连接实体集,但仅在远程预生产服务器上。
我在本地Wamp系统上获得了预期的完整结果集。
数据库位于SQL server ...
应用程序/配置/ parameters.yml
parameters:
database_driver_class: Realestate\MssqlBundle\Driver\PDODblib\Driver
这是一个简单的OneToMany关系,因为在应用程序的其余部分中至少有数百个工作正常。
生成的SQL查询在直接调用时返回正常(返回正确的数组)。
getArrayResult()方法。
由于我甚至没有操纵后面的数据结果,唯一缺少的部分是Doctrine Mapping,它在服务器上的行为似乎不同。
我把代码放在你可以看到的地方,但这是你可以在任何教程或Symfony文档中找到的最简单的基础学校示例。
问题肯定来自某些配置或神秘的系统环境行为。
帮助
Facture.php
/**
* Facture
*
* @ORM\Table(name="GAF_Facture")
* @ORM\Entity(repositoryClass="GA\FacturationBundle\Repository\FactureRepository")
* @FactureAssert\Facture
*/
class Facture {
/**
* @var integer
*
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;
/**
* @ORM\OneToMany(targetEntity="GA\FacturationBundle\Entity\DetailFacture", mappedBy="facture", cascade={"persist"})
* @ORM\OrderBy({"numLigne" = "ASC"})
*/
private $details;
/**
* Get details
*
* @return ArrayCollection
*/
public function getDetails()
{
return $this->details;
}
/**
* Set details
*
* @return Facture
*/
public function setDetails($details)
{
$this->details = $details;
return $this;
}
public function __construct() {
$this->details = new ArrayCollection();
}
}
DetailFacture.php
/**
* DetailFacture
*
* @ORM\Table(name="GAF_DetailFacture")
* @ORM\Entity(repositoryClass="GA\FacturationBundle\Repository\DetailFactureRepository")
*/
class DetailFacture
{
/**
* @var integer
*
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;
/**
* @ORM\ManyToOne(targetEntity="GA\FacturationBundle\Entity\Facture", inversedBy="details")
* @ORM\JoinColumn(name="FactureId", referencedColumnName="id", nullable=false)
*/
private $facture;
/**
* Get id
*
* @return integer
*/
public function getId()
{
return $this->id;
}
/**
* Set facture
*
* @param \GA\FacturationBundle\Entity\Facture $facture
* @return DetailFacture
*/
public function setFacture(\GA\FacturationBundle\Entity\Facture $facture)
{
$this->facture = $facture;
return $this;
}
/**
* Get facture
*
* @return \GA\FacturationBundle\Entity\Facture
*/
public function getFacture()
{
return $this->facture;
}
}
我用来在控制器中测试的简化代码片段:
AnyController.php
...
public function anyAction(){
$dets = $this->em()->getRepository('GAFacturationBundle:Facture')
->createQueryBuilder('f')
->where('f = :facture')
->leftJoin('f.details', 'd')
->addSelect('d')
->setParameter('facture', $facture)
->getQuery()->getOneOrNullResult()
->getDetails();
foreach($dets as $d){
echo $d->getId() .' -- cc -- ';
}
exit;
}
显示器:
在服务器上:
29 - cc -
本地:
29 - cc - 30 - cc - 31 - cc - 32 - cc -
Duuuuuude !! ! ! ! ! !!
编辑:新CLUE 我在另一个查询上重现了这个问题(同一页面,不同的参数..) 我将queryBuilder的addSelect方法与其他工作人员进行了比较后对其进行了修改:我在addSelect中添加了'[':
$qb
...
->addSelect(['ed', 'fr', ... ])
(而不是: - > addSelect('ed','fr,...) )
有点随意尝试..
但它有效!
在
然后回到页面的新实例,问题又出现了......
所以我现在正在寻找一些可能的缓存问题..