持续的完整性约束OneToOne



实体:

实体miejsce

class Miejsce
{
  /**
 *
 * @var Lokalizacja $lokalizacja
 * @ORMOneToOne(targetEntity="MiejsceLokalizacjaBundleEntityLokalizacja",cascade={"persist"})
 * @ORMJoinColumn(name="id", referencedColumnName="miejsce_id")
 */
protected $lokalizacja;

实体lokalizacja

class Lokalizacja {
    /**
     * Lokalizacja.id = Miejsce.id
     * @ORMColumn(type="integer")
     * @ORMId
     */
    protected $id;

       /**
 * @var Miejsce
 * @ORMOneToOne(targetEntity="MiejsceObiektyBundleEntityMiejsce", inversedBy="lokalizacja")
 * @ORMJoinColumn(name="miejsce_id", referencedColumnName="id")
 */
protected $miejsce;
    /**
     * @ORMColumn(type="integer")
     */
    protected $miejsce_id;

我创建新的miejsce

$miejsce = new Miejsce();

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

并获得

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'不能为null

如果我添加persist

 /**
     *
     * @ORMOneToOne(targetEntity="MiejsceLokalizacjaBundleEntityLokalizacja",cascade={"persist"})
     * @ORMJoinColumn(name="id", referencedColumnName="miejsce_id")
     */
    protected $lokalizacja;

执行'插入mlokalizacja(miejsce_id,lat,lng,zoom,zoom,textadres,mmiejscowosci_id,mpowiaty_id,mwojewodztwa_id,y,?)'带有参数[null,49.658192,18.825332,null,null,null,null,null,null,null,null]:

SQLSTATE [23000]:完整性约束违规:1048列'miejsce_id'不能为null

运行代码

    $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,约束FK_41DB4C8BF396750外键(id)参考mLokalizacjamiejsce_id))

那么如何添加miejsce?

update1

class Miejsce
{
    /**
     * @var Lokalizacja $lokalizacja
     * @ORMOneToOne(targetEntity="MiejsceLokalizacjaBundleEntityLokalizacja")
     */
    protected $lokalizacja;

/**
 * @ORMEntity
 *
 * @ORMTable(name="mLokalizacja", indexes={
    @ORMIndex(name="index_latLng", columns={"lat","lng"})
})
*
 */
class Lokalizacja {
    /**
     * @var Miejsce
     * @ORMOneToOne(targetEntity="MiejsceObiektyBundleEntityMiejsce", inversedBy="lokalizacja")
     * @ORMJoinColumn(name="miejsce_id", referencedColumnName="id")
     */
    protected $miejsce;

i更新数据库,然后查看(这是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
     * @ORMOneToOne(targetEntity="MiejsceLokalizacjaBundleEntityLokalizacja" , mappedBy="miejsce")
     */
    protected $lokalizacja;

有错误:

要解决此问题:要么在此未知实体上明确调用EntityManager#persist(),要么配置CASCADE在映射中持续存在此关联,例如@manytoone(..,cascade = {" persist"})。如果您找不到哪些实体导致问题实现'miejsce lokalizacjabundle entity lokalizacja#__ tostring()'获得线索。

所以我添加,cascade = {" persist"}

 * @ORMOneToOne(targetEntity="MiejsceLokalizacjaBundleEntityLokalizacja" , mappedBy="miejsce" ,cascade={"persist"})

现在实体保存成功,但是:)我无法删除它 - 尝试删除miejsce-

我找到了onDelete =" cascade" - 但有错误:

Creation Error] The annotation @ORMOneToOne declared on property MiejsceObiektyBundleEntityMiejsce::$lokalizacja does not have a property named "onDelete". Available properties: targetEntity, mapped  
  By, inversedBy, cascade, fetch, orphanRemoval                                                                                                            

添加到 * @orm onetoone(targetentity =" miejsce lokalizacjabundle entity entity lokalizacja",mappedby =" miejsce",cascade = {" persist"})

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

update3

好的,当我添加

 * @ORMJoinColumn(name="miejsce_id", referencedColumnName="id", onDelete="CASCADE")

lokalizacja eresthink。

您正在尝试建立OneToone双向关系。这样的关系(如所有双向关系),一侧需要提及inversedBy,另一侧需要mappedBy,您在注释中忘记了。

有关关系的更详细信息,请参阅学说文档。

但是,关于您的特定需求,您可以从以下内容开始。

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();

相关内容

  • 没有找到相关文章

最新更新