-->

doctrine2:未定义指数 - 多到一个非默认referencedColumnName不坚持实体

2019-09-22 18:31发布

我使用的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_NO在... \供应商\原则\ ORM \ LIB \原则\ ORM \,持久\ 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

Answer 1:

@ m2mdas:
是的,你说得对,我认为这是可能的,因为JPA(具有影响力的学说)有这个功能 。 属性referencedColumnName只有当你的财产没有在表中的列匹配的情况。

不管结果如何,我发现修补BasicEntityPersister.php的解决方案,在这里看到在GitHub上的要点: https://gist.github.com/3800132

解决的办法是添加属性/字段名称和值的映射列。 此信息已经存在,但不会绑定到正确的地方。 它必须被添加到$ newValId arrray是这样的:

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

它仅适用于多对一参考。 多对多不起作用。
对于多对一我与已经存在的实体进行测试。 您可以测试它,太:

改变学说注释在tests/Doctrine/Tests/Models/Legacy/LegacyArticle.php

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

@JoinColumn(name="username", referencedColumnName="sUsername")


文章来源: doctrine2: undefined index - many-to-one with non default referencedColumnName does not persist entity