【问题标题】:Symfony/Doctrine 2 ManyToOne relationship, ORM does not retain set value for column, error ensuesSymfony/Doctrine 2 ManyToOne 关系,ORM 不保留列的设置值,错误随之而来
【发布时间】:2014-10-29 14:10:30
【问题描述】:

我正在表 B 中创建与表 A 中的一个条目的多对一关系。

在刷新到数据库之前,我正在使用在控制器中设置的特定 key_id 参数。我的问题是 ORM 创建的 SQL 由于某种原因使该键的值为空。在 ManyToOne 关系之前,同一个控制器设置和持久化 key_id 值没有问题。

这是我在表 B 上的注释

    /**
     * @ORM\Column(type="string", length=63)
     * @Filter\Trim()
     * @Filter\StripNewlines()
     */
    private table_b_id

    /**
     * @ORM\ManyToOne(targetEntity="TableA", inversedBy="table_b_entries", fetch="EAGER")
     * @ORM\JoinColumn(name="table_b_id", referencedColumnName="table_a_id")
     */
    private $reference_to_table_a;

还有A表

    /**
     * Constructor
     */
    function __construct()
    {
        $this->table_b_entries = new ArrayCollection();
    }

    /**
     * @ORM\OneToMany(targetEntity="TableB", mappedBy="table_b_id")
     */
    private $table_b_entries;

我得到的错误是:

SQLSTATE[23000]: Integrity constraint violation: 1048 Column 'table_b_id' cannot be null

虽然我确实在刷新到 db 之前在控制器中设置了它,并且我已经验证了我刷新的对象它包含该值,但是 SQL 不再包含该值...我不确定在哪里或为什么会丢失...

更新

这里描述的错误是因为我没有设置引用对象,而是试图在表 B 上手动设置引用列 id。我应该首先获取表 A,然后通过引用在表 B 上设置该对象二传手……

最初的问题是由Doctrine 2 category_id always NULL when set ManyToOne relationship回答的

现在我正在处理另一个错误:

ContextErrorException:注意:未定义的索引:table_a_id in /vagrant/vendor/doctrine/orm/lib/Doctrine/ORM/Persisters/BasicEntityPersister.php 第 628 行

【问题讨论】:

  • 请将控制器代码粘贴到您设置值的位置。
  • 你可能是在暗示正确的事情,我是手动设置外键 id,而不是通过设置外对象来设置关系...

标签: php mysql symfony doctrine-orm many-to-one


【解决方案1】:

ManyToOne 关系不需要两个字段。这就足够了:

class B
{
    /**
     * @ORM\ManyToOne(targetEntity="A", inversedBy="entitiesB")
     * @ORM\JoinColumn(name="name_of_column_on_table_b", referencedColumnName="column_from_table_a_to_be_referenced")
     */
    private $entityA;

    // ...
}

class A
{
    /**
     * @ORM\OneToMany(targetEntity="B", mappedBy="entityA")
     */
    private $entitiesB;

    // ...
}

Doctrine 将自动在您的 B 表上创建名为 entityA_id 的字段,对其进行索引并在两者之间创建外键。

当你有实体B的实例时,你可以通过调用来检索它的A记录关系ID:

$b->getEntityA()->getId()

人们通常认为这会触发另一个查询,但它不会,它只会从B记录中读取entityA_id,解释见here

【讨论】:

  • 谢谢,但是我需要设置一个特定的键列,所以我不能只使用doctrince生成的默认键。这就是为什么我设置@ORM\JoinColumn(name="table_b_id", referencedColumnName="table_a_id")
  • referencedColumnName 似乎有些不对劲?
  • 然后在你的关系字段中加入JoinColumn,仍然不需要额外的ID字段
  • 抱歉,我可能不明白,我必须使用常见的“额外”ID 字段,因为这就是表格的设置方式。而且我正在使用 JoinColumn 来指定应该连接的两列:在表 A 上,table_a_id 和在表 B 上 table_b_id,这些与每个表拥有的 id 列不同,而表 B 没有引用表 A 的 id 列,但在此示例中引用表 A 中的另一列 table_a_id...
  • 它不一定是 id 字段,如果没有设置,那只是默认值,你可以放置任何你想要的列,因为我已经在答案中更新了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-16
  • 1970-01-01
  • 2021-09-24
  • 1970-01-01
  • 2012-03-29
  • 1970-01-01
相关资源
最近更新 更多