实体:
实体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时 - 我得到
symfony2_KPB
。mMiejsce
,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每个人的工作。
答案 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();