tim*_*hew 5 symfony doctrine-orm symfony-2.1
我正在使用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;
}
Run Code Online (Sandbox Code Playgroud)
当我尝试将MyUser实体与Customer实体持久化时,出现以下错误:
注意:未定义的索引:... \ vendor \ doctrine \ orm \ lib \ Doctrine \ ORM \ Persisters \ BasicEntityPersister.php第608行中的customer_no
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;
Run Code Online (Sandbox Code Playgroud)
因此,有是肯定的索引CUSTOMER_NO
//更新: 我修复了inversedBy和mappingBy的问题,但这不是问题。
(1):http : //docs.doctrine-project.org/projects/doctrine-orm/en/latest/reference/association-mapping.html#one-to-many-bidirectional
@m2mdas:
是的,你是对的,我认为这是可能的,因为JPA (对学说有影响)有这个功能。该属性referencedColumnName仅适用于您的属性与表列不匹配的情况。
不管怎样,我通过修补 BasicEntityPersister.php 找到了解决方案,请参阅 github 上的要点: https: //gist.github.com/3800132
解决方案是添加映射列的属性/字段名称和值。该信息已经存在,但未绑定到正确的位置。必须以这种方式将其添加到$newValId数组中:
$fieldName = $targetClass->getFieldName($targetColumn);
$newValId[$fieldName] = $targetClass->getFieldValue($newVal, $fieldName);
Run Code Online (Sandbox Code Playgroud)
它仅适用于 ManyToOne 参考。多对多不起作用。
对于ManyToOne,我使用现有实体对其进行测试。你也可以测试一下:
tests/Doctrine/Tests/Models/Legacy/LegacyArticle.php
更改其中的学说注释
@JoinColumn(name="iUserId", referencedColumnName="iUserId")
Run Code Online (Sandbox Code Playgroud)
到
@JoinColumn(name="username", referencedColumnName="sUsername")
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
6094 次 |
| 最近记录: |