首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >doctrine2:未定义的索引多对一的非默认referencedColumnName不持久化实体。

doctrine2:未定义的索引多对一的非默认referencedColumnName不持久化实体。
EN

Stack Overflow用户
提问于 2012-09-21 20:29:08
回答 1查看 6.8K关注 0票数 5

我正在使用Symfony 2.1.2。

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

代码语言:javascript
复制
/**
 * @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实体持久化为一个客户实体时,我会得到以下错误:

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

db上的模式看起来很好,这些应该是重要的sql模式定义:

代码语言:javascript
复制
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的索引。

//update:修复了inversedBy和mappedBy,但这不是问题所在。

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-09-30 14:43:04

@m2mdas:

是的,你是对的,我认为这是可能的,因为JPA (对学说有影响)具有这一特点。。属性referencedColumnName仅适用于属性与表列不匹配的情况。

无论如何,我通过修补BasicEntityPersister.php找到了一个解决方案,参见github上的要点:https://gist.github.com/3800132

解决方案是为映射列添加属性/字段名和值。这些信息已经在那里了,但并没有被绑定到正确的地方。它必须以这样的方式添加到$newValId arrray中:

代码语言:javascript
复制
$fieldName = $targetClass->getFieldName($targetColumn);
$newValId[$fieldName] = $targetClass->getFieldValue($newVal, $fieldName);

它只适用于ManyToOne引用。ManyToMany不工作。

对于ManyToOne,我用已经存在的实体来测试它。你也可以测试它:

更改tests/Doctrine/Tests/Models/Legacy/LegacyArticle.php中的原则注释

从…

代码语言:javascript
复制
@JoinColumn(name="iUserId", referencedColumnName="iUserId")

代码语言:javascript
复制
@JoinColumn(name="username", referencedColumnName="sUsername")
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12537745

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档