Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/symfony/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Symfony doctrine2:未定义索引-具有非默认ReferenceColumnName的多对一不会持久化实体_Symfony_Doctrine Orm_Symfony 2.1 - Fatal编程技术网

Symfony doctrine2:未定义索引-具有非默认ReferenceColumnName的多对一不会持久化实体

Symfony doctrine2:未定义索引-具有非默认ReferenceColumnName的多对一不会持久化实体,symfony,doctrine-orm,symfony-2.1,Symfony,Doctrine Orm,Symfony 2.1,我使用的是symfony2.1.2 我有两个实体,并定义它们之间的[多对一(双向)](1)关联。我不想将主键用作外键(referencedColumnName)。我想使用另一个整数唯一列:customer\u no /** * @ORM\Entity * @ORM\Table(name="t_myuser") */ class MyUser extends BaseEntity // provides an id (pk) { /** * @ORM\ManyToOne(t

我使用的是symfony2.1.2

我有两个实体,并定义它们之间的[多对一(双向)](1)关联。我不想将主键用作外键(referencedColumnName)。我想使用另一个整数唯一列:customer\u 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\u no在…\vendor\doctor\orm\lib\doctor\orm\Persisters\basicentypersister.php第608行

数据库上的架构看起来不错,以下是重要的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;
因此,肯定有一个客户号的索引

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


(1) :

@m2mdas:
是的,你是对的,我认为这是可能的,因为。属性
referencedColumnName
仅适用于属性与表列不匹配的情况

不管怎样,我通过修补BasicEntityPersister.php找到了一个解决方案,请参见github上的要点:

解决方案是为映射列添加属性/字段名和值。此信息已存在,但未绑定到正确的位置。必须通过以下方式将其添加到$newValId阵列中:

$fieldName = $targetClass->getFieldName($targetColumn);
$newValId[$fieldName] = $targetClass->getFieldValue($newVal, $fieldName);
它只适用于多个参考很多都不起作用。
对于许多人来说,我用已经存在的实体来测试它。您也可以测试它:

更改
tests/doctrine/tests/Models/Legacy/LegacyArticle.php中的条令注释


不确定它是否有什么关系,但是inversedBy和mappedBy应该包含另一个实体中的属性名称,而不是数据库表的名称。它没有说相反的内容。看,上面写着mappedBy=“product”,其中product是要素实体中属性的名称。和inversedBy=“features”,其中features是产品实体中属性的名称。无论我在哪里修复它,它都不涉及表名,但这不是问题所在。
referencedColumnName
将作为联接表主键标识符的状态文档。所以非键列不能被IMHO引用。我提出了一个请求:但是一个条令开发者说:
很抱歉,但是我们不支持不指向主键的引用列。许多非常核心的算法都需要这种假设。
@JoinColumn(name="iUserId", referencedColumnName="iUserId")
@JoinColumn(name="username", referencedColumnName="sUsername")