Doctrine2.0:错误 - 指定了两次列

时间:2011-07-20 15:15:45

标签: php orm doctrine

在Doctrine2.0.6中,我不断收到错误:“Column VoucherId指定了两次”。

有问题的模型是:

  • BasketVoucher

篮子链接到BasketVoucher。

凭证链接到BasketVoucher。

在Voucher和BasketVoucher中,有一个名为VoucherId的字段。这是在两个模型中定义的,并且在两个DB表中都存在相同的名称。

保存新的BasketVoucher记录时出错:

$basketVoucher = new BasketVoucher;
$basketVoucher->setVoucherId($voucherId);
$basketVoucher->setBasketId($this->getBasket()->getBasketId());
$basketVoucher->setCreatedDate(new DateTime("now"));
$em->persist($basketVoucher);
$em->flush();

我检查了模型,而且VoucherId没有定义两次。但是,它用于映射。这就是为什么Doctrine认为这个领域是重复的?

以下是相关代码 - 我没有完整地粘贴模型,因为大部分代码都是get / set。

/**
 * @OneToMany(targetEntity="BasketVoucher", mappedBy="basket")
 * @JoinColumn(name="basketId", referencedColumnName="BasketId")
 */
private $basketVouchers;

public function getVouchers()
{
    return $this->basketVouchers;
}

BasketVoucher

/**
 * @ManyToOne(targetEntity="Basket", inversedBy="basketVouchers")
 * @JoinColumn(name="basketId", referencedColumnName="BasketId")
 */
private $basket;

public function getBasket()
{
    return $this->basket;
}

/**
 * @OneToOne(targetEntity="Voucher", mappedBy="basketVoucher")
 * @JoinColumn(name="voucherId", referencedColumnName="VoucherId")
 */
private $voucherEntity;

public function getVoucher()
{
    return $this->voucherEntity;
}

/**
 * @OneToOne(targetEntity="BasketVoucher", inversedBy="voucherEntity")
 * @JoinColumn(name="voucherId", referencedColumnName="VoucherId")
 */
private $basketVoucher;

public function getBasketVoucher()
{
    return $this->basketVoucher;
}

有什么想法吗?

编辑:我发现第一次保存时,另一个模型出现了同样的问题。我手动设置主键。主要问题似乎是在实体中保存关系。

在这种情况下,我有一个字段 - DraftOrderId - 用作三个模型的主键。第一个模型 - DraftOrder - 将DraftOrderId作为主键,这是一个自动递增值。另外两个模型 - DraftOrderDeliveryAddress和DraftOrderBillingAddress - 也使用DraftOrderId作为主键,但它不会自动递增。

发生的事情是以下问题之一:

  1. 如果我使用草稿订单ID保存交货地址实体并将其设置为持久,则会收到错误:Column DraftOrderId指定了两次。代码:

    try {
        $addressEntity->getDraftOrderId();
    } catch (\Doctrine\ORM\EntityNotFoundException $e) {
        if ($addressType == "delivery") {
            $addressEntity = new Dpp\DraftOrderDeliveryAddress;
        } elseif ($addressType == "billing") {
            $addressEntity = new Dpp\DraftOrderBillingAddress;
        }
        $addressEntity->setDraftOrderId($draftOrder->getDraftOrderId());
        $em->persist($addressEntity);
    }
    
  2. (这也有助于了解是否有更好的方法来检查相关实体是否存在,而不是在尝试获取值时捕获异常。)

    1. 如果我删除设置草稿订单ID的行,则会收到错误:Dpp \ DraftOrderDeliveryAddress类型的实体缺少指定的ID。

    2. 如果我保留设置草稿订单ID的行,但我删除了持久行,并且我稍后在设置名称和地址字段的代码中保留这些行,我没有收到错误 - 但数据未保存到数据库中。我在设置所有字段后使用flush() - 我只是不使用persist()。在前面的例子中,我确实使用了persist() - 我只是试着看看它是如何工作的。

    3. 如果有帮助,我可以粘贴更多代码。

1 个答案:

答案 0 :(得分:0)

我想我已经修好了!几个发现:

  • 对于不是自动递增值的主键,您需要使用:

    @GeneratedValue(策略= “同一性”)

  • 您还必须在第一次创建时明确设置映射实体。起初,我试图直接创建地址实体,但我没有在父模型中设置映射实体来引用地址实体。 (如果这有意义的话)

我很确定这主要是由于缺少IDENTITY关键字,由于某种原因导致该关键字没有设置,或说是设置了两次。