NULL вставляется при сохранении нового объекта, сопоставляя столбец таблицы с 2 таблицами.учение 2 - PullRequest
0 голосов
/ 07 октября 2011

Мне нужно сопоставить один и тот же столбец с двумя таблицами различий (скажем, нормальными и расширенными).

 /**
 * @var ItemValue
 *
 * @OneToOne(targetEntity="ItemValue")
 * @JoinColumn(name="id_value", referencedColumnName="id_value")
 */
private $value;

 /**
 * @var ItemValueExtended
 *
 * @OneToOne(targetEntity="ItemValueExtended")
 * @JoinColumn(name="id_value", referencedColumnName="id_value")
 */
private $valueExtended;

/**
 * @var string $isExtended
 *
 * @Column(name="is_extended", type="string", nullable=false)
 */
private $isExtended = 'YES';

У меня нет проблем с объединением данных на основе атрибута isExtended с использованием DQL:

 "SELECT id,idv FROM ItemData id 
      JOIN id.value idv WHERE  id.isExtended='NO'";

и

 "SELECT id,idv FROM ItemData id 
      JOIN id.valueExtended idv WHERE  id.isExtended='YES'";

но когда я хочу сохранить новый объект, NULL вставляется в столбец id_value? !!

 $oValue = ItemValue();
 .
 .
 $oData = new ItemData();
 $oData->setValue($oValue);
 .
 .
 .
 $em->persist($oData);
 $em->flush();

Любая идея?

Ответы [ 2 ]

1 голос
/ 08 октября 2011

Из документации Doctrine2:

В случае двунаправленных ассоциаций необходимо обновить поля с обеих сторон.

Один Возможное решение будет:

$oData = new ItemData();
$oData->setValue($oValue);
$oValue->setData($oData);

но это утомительно. Другой лучше установить опцию каскада по обе стороны от взаимно-однозначной ассоциации:

@ OneToOne (targetEntity = "ItemValue"), cascade = {"persist", "удалить "})

Таким образом, ваш код будет работать.Вы можете выбрать соответствующие параметры каскада, взглянув на здесь .

0 голосов
/ 19 августа 2014

В случае, когда и родительский, и дочерний объект являются новыми объектами (ни один из них не был сохранен), может помочь событие жизненного цикла PrePersist для родительского объекта:

/**
 * ....
 *
 * @ORM\HasLifecycleCallbacks
 */
class ParentEntity {...

/**
 * @ORM\PrePersist()
 */
public function prePersist() {

    foreach($this->getChildEntities() as $childEntity) {
        $childEntity->setParent($this);
    }
}

-

class ChildEntity {
....

Это автоматически создаст отношения child -> parent при сохранении родителя.Во многих случаях Doctrine сможет отработать все остальное на уровне SQL.

...