Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.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
Php Symfony/DOCTION 2多通关系,ORM不保留列的设置值,错误随之发生_Php_Mysql_Symfony_Doctrine Orm_Many To One - Fatal编程技术网

Php Symfony/DOCTION 2多通关系,ORM不保留列的设置值,错误随之发生

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() *

我正在表B中创建一个与表a中一个条目的多通关系

我正在使用一个特定的key_id参数,该参数在刷新到db之前在控制器中设置。我的问题是,由于某种原因,ORM创建的SQL会使该键的值为空。在多通关系之前,同一控制器在设置和持久化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]:完整性约束冲突: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
和在表B
Table_B_id
上,这两列不同于每个表自己的
id
列,表B不引用表A的
id
列,而是引用表A中的另一列,
table_a_id
在本例中,它不必是id字段,这只是默认值。如果未设置任何内容,您可以放置任何您想要的列,因为我已在答案中进行了更新。