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 一对一关系的主要内容,如果未能解决你的问题,请参考以下文章