Symfony2 一对一关系

Posted

技术标签:

【中文标题】Symfony2 一对一关系【英文标题】:Symfony2 onetoone relationship 【发布时间】:2012-03-13 09:27:45 【问题描述】:

我正在使用 symfony2 开发一个应用程序,并使用 orm.yml 文件将实体映射到数据库中。当尝试为共享单向关系的两个实体(Markagarria.php 和 GalderaPaketea.php)创建关系时,就会出现问题。运行 php app/console doctrine:schema:update --force 时,它会显示下一条消息:Nothing to update - 您的数据库已经与当前实体元数据同步。

这是实体的代码:

<?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:   

【问题讨论】:

您是否尝试在代码中使用该关系? ($obj->getGalderaPaketea())。也许数据库实际上已经更新了。 我正在使用 phpmyadmin 并且设计器部分显示上述实体没有实际关系 【参考方案1】:

看起来您在实体 GalderaPaketea 中的条目应该是:

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

两个实体都没有声明所有权,因此没有执行数据库更新。

查看Doctrine Association mappings - OneToOne Bi-directional

我自己是 Symfony 的新手,我发现这个文档很有帮助。

【讨论】:

以上是关于Symfony2 一对一关系的主要内容,如果未能解决你的问题,请参考以下文章

Symfony2 和 Doctrine:一对多关系

Symfony2 3 个实体之间的映射

Symfony2 映射一对多多音

Symfony 2 使用一对多数据库关系的嵌入式表单

奏鸣曲一对多关系

如何在 Symfony2 中单向持久化一对一实体