Symfony2 одноотношения - PullRequest
       18

Symfony2 одноотношения

1 голос
/ 13 марта 2012

Я занимаюсь разработкой приложения с использованием symfony2 и файлов orm.yml для отображения объектов в базу данных.Проблема возникает при попытке создать отношение для двух сущностей, которые имеют одноэтапное отношение (Markagarria.php и GalderaPaketea.php).При запуске php app/console doctrine:schema:update --force отображается следующее сообщение: Ничего не обновляется - ваша база данных уже синхронизирована с метаданными текущего объекта.

Это код для объектов:

<?php

namespace Anotatzailea\AnotatzaileaBundle\Entity;

use Symfony\Component\Validator\Mapping\ClassMetadata;
use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\ORM\Mapping as ORM;

/**
 * Anotatzailea\AnotatzaileaBundle\Entity\Markagarria
 *
 * @ORM\Table(name="Markagarria")
 * @ORM\Entity
 * @ORM\HasLifecycleCallbacks
 */
class Markagarria
{
    /**
     * @var integer $MarkId
     *
     * @ORM\Column(name="MarkId", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $MarkId;

    /**
     * @ORM\ManyToOne(targetEntity="Dokumentua", inversedBy="Markagarriak")
     * @ORM\JoinColumn(name="DokId", referencedColumnName="DokId")
     */
    protected $Dokumentua;

    /**
     * @ORM\oneToOne(targetEntity="GalderaPaketea", mappedBy="Markagarria")
     */
    private $GalderaPaketea;

    /**
     * Get MarkId
     *
     * @return integer 
     */
    public function getMarkId()
    {
        return $this->MarkId;
    }

    /**
     * Set GalderaPaketea
     *
     * @param Anotatzailea\AnotatzaileaBundle\Entity\GalderaPaketea $galderaPaketea
     */
    public function setGalderaPaketea(\Anotatzailea\AnotatzaileaBundle\Entity\GalderaPaketea $galderaPaketea)
    {
        $this->GalderaPaketea = $galderaPaketea;
    }

    /**
     * Get GalderaPaketea
     *
     * @return Anotatzailea\AnotatzaileaBundle\Entity\GalderaPaketea 
     */
    public function getGalderaPaketea()
    {
        return $this->GalderaPaketea;
    }

    /**
     * Set Dokumentua
     *
     * @param Anotatzailea\AnotatzaileaBundle\Entity\Dokumentua $dokumentua
     */
    public function setDokumentua(\Anotatzailea\AnotatzaileaBundle\Entity\Dokumentua $dokumentua)
    {
        $this->Dokumentua = $dokumentua;
    }

    /**
     * Get Dokumentua
     *
     * @return Anotatzailea\AnotatzaileaBundle\Entity\Dokumentua 
     */
    public function getDokumentua()
    {
        return $this->Dokumentua;
    }
}

<?php

namespace Anotatzailea\AnotatzaileaBundle\Entity;

use Symfony\Component\Validator\Mapping\ClassMetadata;
use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\ORM\Mapping as ORM;

/**
 * Anotatzailea\AnotatzaileaBundle\Entity\GalderaPaketea
 *
 * @ORM\Table(name="GalderaPaketea")
 * @ORM\Entity
 */
class GalderaPaketea
{
    /**
     * @var integer $GalPakId
     *
     * @ORM\Column(name="GalPakId", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $GalPakId;

    /**
     * @var integer $BalidatzeEginak
     *
     * @ORM\Column(name="BalidatzeEginak", type="integer")
     */
    private $BalidatzeEginak;

    /**
     * @var integer $InterpretatzeEginak
     *
     * @ORM\Column(name="InterpretatzeEginak", type="integer")
     */
    private $InterpretatzeEginak;

    /**
     * @var boolean $PaketeEgoera
     *
     * @ORM\Column(name="PaketeEgoera", type="boolean")
     */
    private $PaketeEgoera;

    /**
     * @ORM\oneToOne(targetEntity="Markagarria", mappedBy="GalderaPaketea")
     * @ORM\JoinColumn(name="MarkId", referencedColumnName="MarkId")
     */
    private $Markagarria;

    /**
     * Get GalPakId
     *
     * @return integer 
     */
    public function getGalPakId()
    {
        return $this->GalPakId;
    }

    /**
     * Set BalidatzeEginak
     *
     * @param integer $balidatzeEginak
     */
    public function setBalidatzeEginak($balidatzeEginak)
    {
        $this->BalidatzeEginak = $balidatzeEginak;
    }

    /**
     * Get BalidatzeEginak
     *
     * @return integer 
     */
    public function getBalidatzeEginak()
    {
        return $this->BalidatzeEginak;
    }

    /**
     * Set InterpretatzeEginak
     *
     * @param integer $interpretatzeEginak
     */
    public function setInterpretatzeEginak($interpretatzeEginak)
    {
        $this->InterpretatzeEginak = $interpretatzeEginak;
    }

    /**
     * Get InterpretatzeEginak
     *
     * @return integer 
     */
    public function getInterpretatzeEginak()
    {
        return $this->InterpretatzeEginak;
    }

    /**
     * Set PaketeEgoera
     *
     * @param boolean $paketeEgoera
     */
    public function setPaketeEgoera($paketeEgoera)
    {
        $this->PaketeEgoera = $paketeEgoera;
    }

    /**
     * Get PaketeEgoera
     *
     * @return boolean 
     */
    public function getPaketeEgoera()
    {
        return $this->PaketeEgoera;
    }

    /**
     * Set Markagarria
     *
     * @param Anotatzailea\AnotatzaileaBundle\Entity\Markagarria $markagarria
     */
    public function setMarkagarria(\Anotatzailea\AnotatzaileaBundle\Entity\Markagarria $markagarria)
    {
        $this->Markagarria = $markagarria;
    }

    /**
     * Get Markagarria
     *
     * @return Anotatzailea\AnotatzaileaBundle\Entity\Markagarria 
     */
    public function getMarkagarria()
    {
        return $this->Markagarria;
    }
}

И файлы orm.yml имеют следующее содержимое:

Anotatzailea\AnotatzaileaBundle\Entity\Markagarria:
  type: entity
  table: Markagarria
  fields:
    MarkId:
      type: integer
      id: true
      precision: 0
      scale: 0
      unique: false
      nullable: false
      generator:
        strategy: IDENTITY
  manyToOne:
    Dokumentua:
      targetEntity: Anotatzailea\AnotatzaileaBundle\Entity\Dokumentua
      cascade: {  }
      mappedBy: null
      inversedBy: Markagarriak
      joinColumns:
        DokId:
          referencedColumnName: DokId
      orphanRemoval: false 
  oneToOne:
    GalderaPaketea:
      targetEntity: Anotatzailea\AnotatzaileaBundle\Entity\GalderaPaketea
      cascade: {  }
      mappedBy: Markagarria
  lifecycleCallbacks: {  }

Anotatzailea\AnotatzaileaBundle\Entity\GalderaPaketea:
  type: entity
  table: GalderaPaketea
  fields:
    GalPakId:
      type: integer
      id: true
      precision: 0
      scale: 0
      unique: false
      nullable: false
      generator:
        strategy: IDENTITY
    BalidatzeEginak:
      type: integer
      precision: 0
      scale: 0
      unique: false
      nullable: false
    InterpretatzeEginak:
      type: integer
      precision: 0
      scale: 0
      unique: false
      nullable: false
    PaketeEgoera:
      type: boolean
      precision: 0
      scale: 0
      unique: false
      nullable: false
  oneToOne:
    Markagarria:
      targetEntity: Anotatzailea\AnotatzaileaBundle\Entity\Markagarria
      cascade: {  }
      mappedBy: GalderaPaketea
      joinColumn:
        name: MarkId
        referencedColumnName: MarkId
  lifecycleCallbacks: {  }

1 Ответ

4 голосов
/ 13 марта 2012

Похоже, ваша запись в сущности GalderaPaketea должна быть:

 /**
 * @ORM\oneToOne(targetEntity="Markagarria", inversedBy="GalderaPaketea")
 * @ORM\JoinColumn(name="MarkId", referencedColumnName="MarkId")
 */

Ни один объект не претендует на право собственности, поэтому обновление базы данных не выполняется.

Проверьте Отображения ассоциации доктрин - двунаправленный OneToOne

Я новичок в Symfony и нашел этот документ очень полезным.

...