使用 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 返回相同孩子的学说的主要内容,如果未能解决你的问题,请参考以下文章