坚持诚信约束oneToOne

时间:2014-01-31 20:32:01

标签: php sql symfony doctrine-orm

实体:

实体Miejsce

class Miejsce
{

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

实体Lokalizacja

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

$miejsce = new Miejsce();

....     $ EM->坚持($ miejsce);     $ 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

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

SQLSTATE [23000]:完整性约束违规: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,lat,lng,zoom,textAdres,mMiejscowosci_id,mPowiaty_id,mWojewodztwa_id,street)VALUES(?,?,?,?,?,?,?,?,? )'with params [null,49.658192,18.825332,null,null,null,null,null,null]:

SQLSTATE [23000]:完整性约束违规: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中添加miejsce时 - 我得到

1452 - 无法添加或更新子行:外键约束失败(symfony2_KPBmMiejsce,CONSTRAINT FK_41DB4C8BF396750 FOREIGN KEY(id)REFERENCES {{1 (mLokalizacja))

那么如何添加Miejsce?

UPDATE1

miejsce_id

我更新数据库并看到(这是phpmyadmin表结构):

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;

为什么教义将lokalizacja_id添加到mMiejsce? 而且仍然无法保存

UPDATE2 我添加mappedBy =“miejsce”,数据库现在看起来不错,但是当我尝试保存

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`),

有错误:

通过关系'Miejsce \ ObiektyBundle \ Entity \ Miejsce #lokalizacja'找到了一个新实体,该关系未配置为实体级联持久操作:Miejsce \ LokalizacjaBundle \ Entity \ Lokalizacja @ 000000006200f93900007f919f6a5a6f。要解决此问题:在此未知实体上显式调用EntityManager#persist()或在映射中配置级联持久保存此关联,例如@ManyToOne(..,cascade = {“persist”})。如果您无法找出导致问题的实体,请执行'Miejsce \ LokalizacjaBundle \ Entity \ Lokalizacja #__ toString()'以获取线索。

所以我添加,cascade = {“persist”}

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

现在实体保存成功,但:) 我不能删除它 - 当我尝试删除miejsce -

我发现onDelete =“CASCADE” - 但有错误:

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

当添加到* @ORM \ OneToOne(targetEntity =“Miejsce \ LokalizacjaBundle \ Entity \ Lokalizacja”,mappedBy =“miejsce”,cascade = {“persist”})

那么在哪里添加级联删除?

UPDATE3

好的,当我添加

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                                                                                                            

到lokalizacja每个人的工作。

1 个答案:

答案 0 :(得分:1)

您正在尝试建立oneToOne双向关系。这种关系(如所有双向关系)需要在一侧提及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();