Php Symfony/DOCTION 2多通关系,ORM不保留列的设置值,错误随之发生
我正在表B中创建一个与表a中一个条目的多通关系 我正在使用一个特定的key_id参数,该参数在刷新到db之前在控制器中设置。我的问题是,由于某种原因,ORM创建的SQL会使该键的值为空。在多通关系之前,同一控制器在设置和持久化key_id值方面没有问题 这是我在表B上的注释Php Symfony/DOCTION 2多通关系,ORM不保留列的设置值,错误随之发生,php,mysql,symfony,doctrine-orm,many-to-one,Php,Mysql,Symfony,Doctrine Orm,Many To One,我正在表B中创建一个与表a中一个条目的多通关系 我正在使用一个特定的key_id参数,该参数在刷新到db之前在控制器中设置。我的问题是,由于某种原因,ORM创建的SQL会使该键的值为空。在多通关系之前,同一控制器在设置和持久化key_id值方面没有问题 这是我在表B上的注释 /** * @ORM\Column(type="string", length=63) * @Filter\Trim() * @Filter\StripNewlines() *
/**
* @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]:完整性约束冲突:1048列“table_b_id”不能为空
虽然我在刷新到db之前在控制器中设置了它,并且我已经验证了我刷新的对象是否包含该值,但是SQL不再包含该值。。。我不知道它在哪里或者为什么会丢失
更新
这里描述的错误是因为我没有设置引用对象,而是试图在表B上手动设置引用列id。我应该先获取表A,然后通过引用设置器在表B上设置该对象
初步问题的答复如下:
现在我正在处理另一个错误:
ContextErrorException:注意:未定义的索引:中的表\u a\u id
/vagrant/vendor/doctrine/orm/lib/doctrine/orm/persister/basicentypersister.php
第628行
对于多对一关系,不需要两个字段。这就足够了:
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;
// ...
}
条令将自动在B
表上创建名为entityA\u id
的字段,对其进行索引并在两者之间创建外键
当您有实体B
的实例时,您可以通过调用以下命令来检索它的A
记录关系Id:
$b->getEntityA()->getId()
人们通常认为这会触发另一个查询,但它不会,它只会从
B
记录中读取entityA\u id
,例如,请将控制器代码粘贴到设置值的位置。您可能暗示了正确的事情,我手动设置了外键id,不是通过设置外部对象来设置关系…谢谢,但是我需要设置一个特定的键列,所以我不能只使用doctrince生成的默认键列。这就是我设置@ORM\JoinColumn(name=“table_b_id”,referencedColumnName=“table_a_id”)
的原因,只是好像referencedColumnName
有点不对劲?然后只在关系字段中包含JoinColumn,仍然不需要额外的id字段抱歉,也许我不明白,我必须使用普通的“extra”ID字段,因为这是表的设置方式。我使用JoinColumn来指定应该连接的两列:在表A上,Table_A_id
和在表BTable_B_id
上,这两列不同于每个表自己的id
列,表B不引用表A的id
列,而是引用表A中的另一列,table_a_id
在本例中,它不必是id字段,这只是默认值。如果未设置任何内容,您可以放置任何您想要的列,因为我已在答案中进行了更新。