php - persist Integrity constraint oneToOne -
entities :
entity miejsce
class miejsce { /** * * @var lokalizacja $lokalizacja * @orm\onetoone(targetentity="miejsce\lokalizacjabundle\entity\lokalizacja",cascade={"persist"}) * @orm\joincolumn(name="id", referencedcolumnname="miejsce_id") */ protected $lokalizacja;
entity 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;
i create new miejsce
$miejsce = new miejsce();
.... $em->persist($miejsce); $em->flush();
and
sqlstate[23000]: integrity constraint violation: 1452 cannot add or update child row: foreign key constraint fails (`symfony2_kpb_lazy`.`mmiejsce`, constraint `fk_41db4c8bf396750` foreign key (`id`) references `mlokalizacja` (`miejsce_id`))
if first setup lokalizacja
$lokalizacja = new lokalizacja(); $lokalizacja->setlat($a['lat']); $lokalizacja->setlng($a['lng']); $em->persist($lokalizacja); $em->flush();
sqlstate[23000]: integrity constraint violation: 1048 column 'miejsce_id' cannot null
if add persist
/** * * @orm\onetoone(targetentity="miejsce\lokalizacjabundle\entity\lokalizacja",cascade={"persist"}) * @orm\joincolumn(name="id", referencedcolumnname="miejsce_id") */ protected $lokalizacja;
an exception occurred while executing 'insert mlokalizacja (miejsce_id, lat, lng, zoom, textadres, mmiejscowosci_id, mpowiaty_id, mwojewodztwa_id, street) values (?, ?, ?, ?, ?, ?, ?, ?, ?)' params [null, 49.658192, 18.825332, null, null, null, null, null, null]:
sqlstate[23000]: integrity constraint violation: 1048 column 'miejsce_id' cannot null
when run code
$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();
when try add miejsce in phpmyadmin -
1452 - cannot add or update child row: foreign key constraint fails (symfony2_kpb
.mmiejsce
, constraint fk_41db4c8bf396750
foreign key (id
) references mlokalizacja
(miejsce_id
))
so how add miejsce ?
update1
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;
i update database , see (this phpmyadmin table structure):
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`), , 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`),
why doctrine add lokalizacja_id mmiejsce ? , still save not possible
update2 add mappedby="miejsce", database ok when try save
class miejsce { /** * @var lokalizacja $lokalizacja * @orm\onetoone(targetentity="miejsce\lokalizacjabundle\entity\lokalizacja" , mappedby="miejsce") */ protected $lokalizacja;
have error :
a new entity found through relationship 'miejsce\obiektybundle\entity\miejsce#lokalizacja' not configured cascade persist operations entity: miejsce\lokalizacjabundle\entity\lokalizacja@000000006200f93900007f919f6a5a6f. solve issue: either explicitly call entitymanager#persist() on unknown entity or configure cascade persist association in mapping example @manytoone(..,cascade={"persist"}). if cannot find out entity causes problem implement 'miejsce\lokalizacjabundle\entity\lokalizacja#__tostring()' clue.
so add ,cascade={"persist"}
* @orm\onetoone(targetentity="miejsce\lokalizacjabundle\entity\lokalizacja" , mappedby="miejsce" ,cascade={"persist"})
now entity save succes :) cant delete - when try delete miejsce -
i found ondelete="cascade" - have error :
creation error] annotation @orm\onetoone declared on property miejsce\obiektybundle\entity\miejsce::$lokalizacja not have property named "ondelete". available properties: targetentity, mapped by, inversedby, cascade, fetch, orphanremoval
when add * @orm\onetoone(targetentity="miejsce\lokalizacjabundle\entity\lokalizacja" , mappedby="miejsce" ,cascade={"persist"})
so add cascade delete ?
update3
ok when add
* @orm\joincolumn(name="miejsce_id", referencedcolumnname="id", ondelete="cascade")
to lokalizacja everythink work.
you trying establish onetoone bidirectional relationship. such relationship (as bidirectional ones) needs mention inversedby
on 1 side , mappedby
on other, forgot in annotation.
for more detailed informations relationships, see doctrine documentation.
but regarding particular need, can start following.
miejsce:
class miejsce { /** * @onetoone(targetentity="lokalizacja", mappedby="miejsce", cascade={"remove"}) */ private $lokalizacja;
here forgot mappedby
.
lokalizacja:
class lokalizacja { /** * @onetoone(targetentity="miejsce", inversedby="lokalizacja") */ private $miejsce;
when join based on id
, joincolumn optional , can omit (as did).
then, go on with:
// (...) $em->persist($miejsce); $em->flush();
Comments
Post a Comment