Я создаю отношение 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
Вам не нужно два поля для отношения 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
запись, для объяснения см. Вот
Других решений пока нет …