2014-01-31 2 views
0

Entities:сохраняются Integrity ограничение OneToOne

Entity Place

class Miejsce 
{ 

    /** 
* 
* @var Lokalizacja $lokalizacja 
* @ORM\OneToOne(targetEntity="Miejsce\LokalizacjaBundle\Entity\Lokalizacja",cascade={"persist"}) 
* @ORM\JoinColumn(name="id", referencedColumnName="miejsce_id") 
*/ 
protected $lokalizacja; 

Entity Место жительства

class Lokalizacja { 

    /** 
    * Lokalizacja.id = Miejsce.id 
    * @ORM\Column(type="integer") 
    * @ORM\Id 
    */ 
    protected $id; 


     /** 
* @var Miejsce 
* @ORM\OneToOne(targetEntity="Miejsce\ObiektyBundle\Entity\Miejsce", inversedBy="lokalizacja") 
* @ORM\JoinColumn(name="miejsce_id", referencedColumnName="id") 
*/ 
protected $miejsce; 

    /** 
    * @ORM\Column(type="integer") 
    */ 
    protected $miejsce_id; 

Место и создать новый

$miejsce = new Miejsce(); 

.... $ em- > Упорство ($ положения); $ em-> флеш();

и получить

SQLSTATE[23000]: Integrity constraint violation: 1452 Cannot add or update a child row: a foreign key constraint fails (`symfony2_KPB_lazy`.`mMiejsce`, CONSTRAINT `FK_41DB4C8BF396750` FOREIGN KEY (`id`) REFERENCES `mLokalizacja` (`miejsce_id`)) 

если и первое место установки

$lokalizacja = new Lokalizacja(); 
     $lokalizacja->setLat($a['lat']); 
     $lokalizacja->setLng($a['lng']); 
     $em->persist($lokalizacja); 
     $em->flush(); 

SQLSTATE [23000]: Integrity нарушение ограничения: 1048 Колонка 'miejsce_id' не может быть пустым

если и добавить сохраняются

/** 
    * 
    * @ORM\OneToOne(targetEntity="Miejsce\LokalizacjaBundle\Entity\Lokalizacja",cascade={"persist"}) 
    * @ORM\JoinColumn(name="id", referencedColumnName="miejsce_id") 
    */ 
    protected $lokalizacja; 

Исключение при выполнении «INSERT INTO mLokalizacja (miejsce_id, лат, LNG, масштабирование textAdres, mMiejscowosci_id, mPowiaty_id, mWojewodztwa_id, улица) VALUES (?,?,?,?,?,?,?,?,?) 'с Params [Null, 49.658192, 18.825332, NULL, NULL, NULL, NULL, NULL, NULL]:

SQLSTATE [23000]: Integrity нарушение ограничения: 1048 Колонка' miejsce_id «не может быть пустым

при запуске код

$miejsce = new Miejsce(); 

     $lokalizacja = new Lokalizacja(); 
     $lokalizacja->setLat($a['lat']); 
     $lokalizacja->setLng($a['lng']); 
     $lokalizacja->setMiejsce($miejsce); 

     $miejsce->setLokalizacja($lokalizacja); 

$em->persist($miejsce); 
     $em->flush(); 

, когда я пытаюсь добавить место в PhpMyAdmin - и получить

1452 - Невозможно добавить или обновить дочернюю строку: ограничение внешнего ключа не удается (symfony2_KPB. mMiejsce, FK_41DB4C8BF396750 CONSTRAINT FOREIGN KEY (id) Лит mLokalizacja (miejsce_id))

Так как добавить место?

Update1

class Miejsce 
{ 

    /** 
    * @var Lokalizacja $lokalizacja 
    * @ORM\OneToOne(targetEntity="Miejsce\LokalizacjaBundle\Entity\Lokalizacja") 
    */ 
    protected $lokalizacja; 



/** 
* @ORM\Entity 
* 
* @ORM\Table(name="mLokalizacja", indexes={ 
    @ORM\Index(name="index_latLng", columns={"lat","lng"}) 
}) 
* 
*/ 
class Lokalizacja { 

    /** 
    * @var Miejsce 
    * @ORM\OneToOne(targetEntity="Miejsce\ObiektyBundle\Entity\Miejsce", inversedBy="lokalizacja") 
    * @ORM\JoinColumn(name="miejsce_id", referencedColumnName="id") 
    */ 
    protected $miejsce; 

и обновление базы данных и увидеть (это структура PHPMyAdmin таблица):

CREATE TABLE IF NOT EXISTS `mMiejsce` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `nazwa` varchar(255) COLLATE utf8_polish_ci NOT NULL, 
    `parent_id` int(11) DEFAULT NULL, 
    `lokalizacja_id` int(11) DEFAULT NULL, 
    PRIMARY KEY (`id`), 

and lokalizacja 
CREATE TABLE IF NOT EXISTS `mLokalizacja` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `lat` double NOT NULL, 
    `lng` double NOT NULL, 
    `zoom` int(11) NOT NULL, 
    `miejsce_id` int(11) DEFAULT NULL, 
    PRIMARY KEY (`id`), 
    UNIQUE KEY `UNIQ_4FC27791464204DC` (`miejsce_id`), 

Почему добавить lokalizacja_id учение mMiejsce? И еще спасти не представляется возможным

UPDATE2 я добавить mappedBy = «Miejsce», база данных выглядит хорошо сейчас, но когда я пытаюсь сохранить

class Miejsce 
{ 
    /** 
    * @var Lokalizacja $lokalizacja 
    * @ORM\OneToOne(targetEntity="Miejsce\LokalizacjaBundle\Entity\Lokalizacja" , mappedBy="miejsce") 
    */ 
    protected $lokalizacja; 

есть ошибка:

Новый объект был найден через отношение «Miejsce \ ObiektyBundle \ Entity \ Miejsce # lokalizacja», которое не было настроено на каскадное сохранение операций для объекта: Miejsce \ LokalizacjaBundle \ Entity \ Lokalizacja @ 000000006200f93900007f919f6a5a6f. Чтобы решить эту проблему: либо явно вызовите EntityManager # persist() на этом неизвестном объекте, либо сконфигурируйте каскад, сохраняйте эту ассоциацию в сопоставлении, например, @ManyToOne (.., cascade = {"persist"}). Если вы не можете выяснить, какой объект вызывает проблему, выполните «Miejsce \ LokalizacjaBundle \ Entity \ Lokalizacja #__ toString()», чтобы получить ключ.

так я добавить, каскад = { "упорствовать"}

* @ORM\OneToOne(targetEntity="Miejsce\LokalizacjaBundle\Entity\Lokalizacja" , mappedBy="miejsce" ,cascade={"persist"}) 

Теперь объект сохранить SucceS но :) я не могу удалить его - при попытке удалить Miejsce -

я нашел OnDelete =» кАСКАД»- но есть ошибка:

Creation Error] The annotation @ORM\OneToOne declared on property Miejsce\ObiektyBundle\Entity\Miejsce::$lokalizacja does not have a property named "onDelete". Available properties: targetEntity, mapped 
    By, inversedBy, cascade, fetch, orphanRemoval                            

когда добавить в * @ORM \ OneToOne (targetEntity = "Miejsce \ LokalizacjaBundle \ Entity \ Lokalizacja", mappedBy = "Miejsce", каскад = { "упорствовать"})

Итак, где добавить каскад delete?

Update3

нормально, когда я добавить

* @ORM\JoinColumn(name="miejsce_id", referencedColumnName="id", onDelete="CASCADE") 

в Lokalizacja Everythink работу.

ответ

1

Вы пытаетесь установить одностороннее двунаправленное отношение. Такие отношения (как и все двунаправленные) нуждаются в упоминании inversedBy с одной стороны и mappedBy - с другой, которые вы забыли в своей аннотации.

Для получения более подробной информации об отношениях см. Doctrine documentation.

Но в отношении вашей конкретной потребности вы можете начать со следующего.

Miejsce:

class Miejsce 
{ 
    /** 
    * @OneToOne(targetEntity="Lokalizacja", mappedBy="miejsce", cascade={"remove"}) 
    */ 
    private $lokalizacja; 

Здесь вы забыли mappedBy.

Lokalizacja:

class Lokalizacja 
{ 
    /** 
    * @OneToOne(targetEntity="Miejsce", inversedBy="lokalizacja") 
    */ 
    private $miejsce; 

Когда вы присоединяетесь на основе id, JoinColumn не является обязательным, и вы можете опустить его (как я).

Затем вы идете нормально с:

// (...) 
$em->persist($miejsce); 
$em->flush(); 
+0

Да спасительной работы, но Канот удалить - как настроить - если я удалить Miejsce я хочу удалить Lokalizacja –

+0

@GrekHmhmm см редактировать – Jivan

Смежные вопросы