Doctrine SQLServer OneToMany leftjoin仅在生产服务器上返回/映射一行

时间:2016-02-02 18:24:57

标签: php sql-server symfony doctrine-orm

奇怪而恼人的问题:

在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,...) )

有点随意尝试..

但它有效!

然后回到页面的新实例,问题又出现了......

所以我现在正在寻找一些可能的缓存问题..

0 个答案:

没有答案