使用 MSSQL 返回相同孩子的学说

Posted

技术标签:

【中文标题】使用 MSSQL 返回相同孩子的学说【英文标题】:Doctrine with MSSQL returning same children 【发布时间】:2016-03-22 16:17:56 【问题描述】:

我正在使用现有的 MSSQL 数据库(Dynamics)并从中获取数据,我将数据库布局克隆到 Doctrine 实体中,以便从数据库中获取数据。这适用于单一实体,但是当我有 OneToMany 关系时,就会出现问题。它返回正确数量的孩子,但他们都是一样的。

当我将可运行查询复制粘贴到 SQL Server 中时,我得到了正确的结果(具有不同的子级)。所以 SQL 查询是好的。

因此,Doctrine 似乎没有正确地对结果进行补水。我在 Symfony 2.8 中使用 pdo_sqlsrv 驱动程序和 Doctrine2。

动态表布局:

PurchTable
recid = unique integer
purchid = unique string

PurchLine
recid = unique integer
purchid = referring to purchid from PurchTable
itemid = string
etc...

PurchTable 实体:

 /**
 * @var integer
 *
 * @ORM\Column(name="recid", type="integer")
 */
private $recid;

/**
 * @var string
 *
 * @ORM\Column(name="purchid", type="string", length=255)
 * @ORM\Id
 */
private $orderid;

/**
 * @ORM\OneToMany(targetEntity="PurchLine", mappedBy="order")
 */
protected $lines;

public function __construct()

    $this->lines = new ArrayCollection();

采购线:

/**
 * @var integer
 *
 * @ORM\Column(name="recid", type="integer")
 * @ORM\Id
 */
private $recid;

/**
 * @var integer
 *
 * @ORM\Column(name="linenum", type="integer")
 */
private $linenum;

/**
 * @var string
 *
 * @ORM\Column(name="itemid", type="string", length=255)
 */
private $itemid;

/**
 * @ORM\ManyToOne(targetEntity="PurchTable", inversedBy="lines")
 * @ORM\JoinColumn(name="purchid", referencedColumnName="purchid")
 */
protected $order;

如您所见,我在 PurchTable 中将属性名称更改为 orderid 以避免使用相同的名称,但这并没有帮助。

那我做错了什么? :)

我无法在短时间内更改驱动程序,所以我想知道这是否是驱动程序问题(更改更改驱动程序的优先级)。看完这篇:

http://doctrine-orm.readthedocs.org/projects/doctrine-dbal/en/latest/reference/configuration.html#driver

使用 pdo_sqlsrv PDO 的 Microsoft SQL Server 驱动程序 请注意,此驱动程序在我们的测试中引起了问题。如果可能,首选 sqlsrv 驱动程序。

我想知道 pdo_sqlsrv 驱动程序是否会导致这些问题。

编辑

我测试了 sqlsrv 驱动程序(确保使用空字符串作为用户名而不是 null(对于 pdo_sqlsrv)以使用 Windows 身份验证),我遇到了同样的问题。所以它一定是教义或关系中的东西。

编辑 2

我重新创建实体以避免任何拼写错误,但无济于事。

【问题讨论】:

【参考方案1】:

问题在于列的错误定义。 MSSQL 数据库中的 RecId 列是 bigint 而不是整数。

所以,改变

/**
 * @var integer
 *
 * @ORM\Column(name="recid", type="integer")
 * @ORM\Id
 */
private $recid;

/**
 * @var bigint
 *
 * @ORM\Column(name="recid", type="bigint")
 * @ORM\Id
 */
private $recid;

就是答案。

【讨论】:

以上是关于使用 MSSQL 返回相同孩子的学说的主要内容,如果未能解决你的问题,请参考以下文章

学说不能返回 json 查询的结果

使用连接表返回结果的学说不起作用 Symfony2

为啥 symfony 学说 findall() 返回 id NULL

从查询学说返回字符串

DQL 和等效 SQL 不返回相同数量的结果集

Symfony - 在学说查询构建器中使用 orWhere()