gpt4 book ai didi

doctrine-orm - Science2 OneToMany 关系插入 NULL 作为外键

转载 作者:行者123 更新时间:2023-12-04 19:19:47 25 4
gpt4 key购买 nike

我在 ZendFramework 1.11.2 中使用 Doctrine 2 作为 ORM 有一个双向 OneToMany 关系。

注意:Doctrine 没有创建数据库表。数据库是 MySQL。

出于某种原因,当我坚持并将新的链接实体刷新到链接表(见下文)时,外键字段 (container_id) 被设置为 NULL。但是,如果从 'ManyToOne(targetEntity="Shepherd\Navigation\Domain\Container\Model", inversedBy="links")' 行中删除了 '@' 符号,则会正确填充外键字段。

由于删除“@”符号时实体已正确添加到数据库中,因此 OneToMany 关系在某处存在问题。

例如,如果我有一个名为 $link 的链接模型(请参阅下面的伪代码)...

 $link (Shepherd\Navigation\Domain\Link\Model) 
{
id: '' // auto generated value
cid: 23 // the foreign key value
label: test
uri: test.com
... // other values not listed here for brevity
}

...当新的链接模型被持久化并刷新实体管理器时,来自链接 (shepherd_navigation_link) 表中新插入行的 container_id(外键)值为 NULL。
    $em // Assume $em is the Entity Manager
$em->persist($link);
$em->flush();

// The container_id in the newly added row in the
// link table (shepherd_navigation_link) is NULL

链接表架构:
CREATE TABLE `shepherd_navigation_link` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`container_id` int(10) unsigned DEFAULT NULL,
`node_id` int(10) unsigned DEFAULT NULL,
`parent_id` int(10) unsigned DEFAULT NULL,
`label` varchar(100) NOT NULL,
`options` text,
`events` text,
`privilege` varchar(100) NOT NULL,
`resource` varchar(100) DEFAULT NULL,
`uri` varchar(300) NOT NULL,
`visible` int(10) unsigned DEFAULT '1',
PRIMARY KEY (`id`),
KEY `container_id` (`container_id`)
) ENGINE=InnoDB
ALTER TABLE `shepherd_navigation_link` ADD FOREIGN KEY (container_id) REFERENCES shepherd_navigation_container(id)

链接实体模型:
/**
* @Entity
* @Table(name="shepherd_navigation_link")
*/
class
{
/**
* @Id
* @Column(type="integer")
* @GeneratedValue
*/
protected $id;

/**
* @Column(name="container_id", type="integer", nullable=false)
*/
protected $cid;

/**
* @Column(name="node_id", type="integer")
*/
protected $nid;

/**
* @Column(name="parent_id", type="integer", nullable=false)
*/
protected $pid;

/**
* @Column
*/
protected $label;

/**
* @Column(nullable=true)
*/
protected $options;

/**
* @Column(nullable=true)
*/
protected $events;

/**
* @Column
*/
protected $privilege;

/**
* @Column(nullable=true)
*/
protected $resource;

/**
* @Column
*/
protected $uri;

/**
* @Column(type="integer", nullable=true)
*/
protected $visible;

/**
* @OneToMany(targetEntity="Model", mappedBy="parent")
*/
private $children;

/**
* @ManyToOne(targetEntity="Model", inversedBy="children")
*/
private $parent;

/**
*) @ManyToOne(targetEntity="Shepherd\Navigation\Domain\Container\Model", inversedBy="links"
*/
private $container;

/**
* @OneToOne(targetEntity="Shepherd\Navigation\Domain\Link\Position", inversedBy="link")
*/
private $node;

public function __construct()
{
$this->children = new \Doctrine\Common\Collections\ArrayCollection();
}

/** Accessors and Mutators excluded for brevity **/
}

注意: protected 属性 $cid 映射到上面的 container_id 列。

容器表架构:
CREATE TABLE `shepherd_navigation_container` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`name` varchar(100) NOT NULL,
`description` text,
PRIMARY KEY (`id`)
) ENGINE=InnoDB

容器实体模型:
/**
* @Entity
* @Table(name="shepherd_navigation_container")
*/
class Model
{
/**
* @Id
* @Column(type="integer")
* @GeneratedValue
*/
protected $id;

/**
* @Column
*/
protected $name;

/**
* @Column(nullable=true)
*/
protected $description;

/**
* @OneToMany(targetEntity="Shepherd\Navigation\Domain\Link\Model", mappedBy="container")
*/
private $links;

/**
* Constructor
*/
public function __construct()
{
$this->links = new \Doctrine\Common\Collections\ArrayCollection();
}

/** Accessors and Mutators excluded for brevity **/
}

我错过了什么?我究竟做错了什么?

最佳答案

我发现了这个问题(通过阅读文档 http://www.doctrine-project.org/docs/orm/2.0/en/tutorials/getting-started-xml-edition.html )。事实证明,实际上存在一些问题。

问题 1 => 我没有提供设置容器变量的方法。

// Inside the Link Entity class...

public function setContainer($container)
{
$this->container = $container;
}

问题 2 => 我没有设置容器值。错误地,我认为 Doctrine 2 在内部做了这个,但我发现需要在刷新之前设置容器变量。

我的愚蠢疏忽。
$link = new Link();
$link->setContainer($container);

// $em is the Entity Manager
$em->persist($link);
$em->flush();

问题 3 => 容器 ($container) 需要在刷新之前持久化,或者需要更改容器实体上的 @OneToMany 定义。我选择更新容器实体定义。查看此处 ( http://www.doctrine-project.org/docs/orm/2.0/en/reference/working-with-associations.html#transitive-persistence-cascade-operations ) 了解更多信息。
// Inside the Container Entity class...
/**
* @OneToMany(targetEntity="Shepherd\Navigation\Domain\Link\Model", mappedBy="container", cascade={"persist"})
*/

在进行这些更改并删除链接实体类中的 @OneToOne 节点关系后(结果我不需要它),一切正常。我希望这可以帮助别人。

关于doctrine-orm - Science2 OneToMany 关系插入 NULL 作为外键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5332224/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com