5

我正在使用 Symfony 2.1.2。

我有两个实体并在它们之间定义 [多对一(双向)] (1) 关联。我不想将主键用作外键(referencedColumnName)。我想使用另一个整数唯一列:customer_no

/**
 * @ORM\Entity
 * @ORM\Table(name="t_myuser")
 */
class MyUser extends BaseEntity // provides an id (pk)
{
    /**
     * @ORM\ManyToOne(targetEntity="Customer", inversedBy="user")
     * @ORM\JoinColumn(name="customer_no", referencedColumnName="customer_no", nullable=false)
     */
    public $customer;
}

/**
 * @ORM\Entity
 * @ORM\Table(name="t_customer")
 */
class Customer extends BaseEntity // provides an id (pk)
{
    /**
     * @ORM\Column(type="integer", unique=true, nullable=false)
     */
    public $customer_no;

    /**
     * @ORM\OneToMany(targetEntity="MyUser", mappedBy="customer")
     */
    public $user;
}

当我尝试将 MyUser 实体与 Customer 实体持久化时,我收到此错误:

注意:未定义索引:customer_no in ...\vendor\doctrine\orm\lib\Doctrine\ORM\Persisters\BasicEntityPersister.php 行 608

db 上的架构看起来不错,这些应该是重要的 sql 架构定义:

CREATE UNIQUE INDEX UNIQ_B4905AC83CDDA96E ON t_customer (customer_no);
CREATE INDEX IDX_BB041B3B3CDDA96E ON t_myuser (customer_no);
ALTER TABLE t_myuser ADD CONSTRAINT FK_BB041B3B3CDDA96E FOREIGN KEY (customer_no) 
  REFERENCES t_customer (customer_no) NOT DEFERRABLE INITIALLY IMMEDIATE;

所以肯定customer_no的索引

//更新: 我修复了 inversedBy 和 mappedBy 的东西,但这不是问题。

(1) : http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/reference/association-mapping.html#one-to-many-bidirectional

4

1 回答 1

2

@m2mdas:
是的,您是对的,我认为这是可能的,因为JPA(对学说有影响)具有此功能。该属性referencedColumnName仅适用于您的属性与表列不匹配的情况。

不管怎样,我通过修补 BasicEntityPersister.php 找到了解决方案,请参阅 github 上的要点:https ://gist.github.com/3800132

解决方案是为映射列添加属性/字段名称和值。此信息已经存在,但未绑定到正确的位置。它必须以这种方式添加到$newValId数组中:

$fieldName = $targetClass->getFieldName($targetColumn);
$newValId[$fieldName] = $targetClass->getFieldValue($newVal, $fieldName);

它仅适用于 ManyToOne 参考。多对多不起作用。
对于 ManyToOne,我使用已经存在的实体对其进行测试。你也可以测试它:

将教义注释tests/Doctrine/Tests/Models/Legacy/LegacyArticle.php

@JoinColumn(name="iUserId", referencedColumnName="iUserId")

@JoinColumn(name="username", referencedColumnName="sUsername")
于 2012-09-30T14:43:04.770 回答