Symfony / Doctrine 2 Отношение ManyToOne, ORM не сохраняет установленное значение для столбца, возникает ошибка

Я создаю отношение ManyToOne в таблице B к одной записи в таблице A.

Я использую определенный параметр key_id, который устанавливается в контроллере, прежде чем сбрасывается в БД. Моя проблема в том, что SQL, созданный ORM, по какой-то причине обнуляет значение этого ключа. До связи 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;

И таблица А

    /**
* 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. Мне следовало сначала получить таблицу A и установить этот объект в таблице B через установщик ссылок. ,

На первоначальный вопрос ответили: Doctrine 2 category_id всегда NULL, когда установлено отношение ManyToOne

Теперь я имею дело с другой ошибкой:

ContextErrorException: Примечание: неопределенный индекс: table_a_id в
/vagrant/vendor/doctrine/orm/lib/Doctrine/ORM/Persisters/BasicEntityPersister.php
линия 628

0

Решение

Вам не нужно два поля для отношения 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 автоматически создаст поле с именем entityA_id на ваше B таблица, индексировать его и создать внешний ключ между ними.

Когда у вас есть экземпляр сущности BВы можете получить это A Id отношения записи, просто позвонив:

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

Люди обычно думают, что это вызовет другой запрос, но это не так, он просто прочитает entityA_id от B запись, для объяснения см. Вот

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]