实体:
实体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_KPB
。mMiejsce
,约束FK_41DB4C8BF396750
外键(id
)参考mLokalizacja
(miejsce_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();