2013-03-23 11 views
12

Ich habe eine Story-Tabelle und Benutzer-Tabelle. Die Spalte userid in der Story-Tabelle ist ein Fremdschlüssel, der die ID in der Benutzertabelle anspricht.Doktrin viele zu einer Beziehung persist Operation

Ich habe festgelegt, die Beziehung ist, dass ein Benutzer viele Geschichten haben kann, die in der Story-Tabelle gespeichert ist. Ich habe die Entitäten beider Tabellen erstellt.

Wenn Sie jedoch versuchen, die Operation nur für die Story-Tabelle beizubehalten, werden die Details für den neuen Benutzereintrag abgefragt.

Mein Ziel ist es, eine neue Geschichte mit bestehenden userId hinzuzufügen.

Am den Fehler Posting hier:

Eine neue Einheit durch die Beziehung gefunden wurde ‚Geschichte # _userId‘ dass nicht Kaskade konfiguriert wurde anhalten Operationen für Unternehmen: Benutzer @ 0000000038960c50000000008ea93852. Um dieses Problem zu lösen: Entweder explizit EntityManager # persist() auf dieser unbekannten Entität aufrufen oder configure cascade persistent diese Zuordnung im Mapping zum Beispiel @ManyToOne (.., cascade = {\ "persist \"}).

Ich habe ManyToOne Beziehung in Story Einheit:

/** 
* @ManyToOne(targetEntity="User", inversedBy = "_story") 
* @JoinColumns({ 
*  @JoinColumn(name="user_id", referencedColumnName="id") 
* }) 
*/ 

private $_userId; 

ich das Datenbankschema geprüft und es zeigt die Beziehung richtig eingestellt ist. Also habe ich den Story-Insertion-Prozess gemacht.

Antwort

0

Ich habe Mühe zu verstehen, was Sie brauchen, also bin ich mir nicht sicher, ob das auf Ihre Frage antworten wird.

Da die story.user_id ID ein Fremdschlüssel von user.id ist (was ein Primärschlüssel ist), kann dies nicht leer/null sein. Wenn Sie beispielsweise eine PHP-Sitzung haben, sollten Sie Ihre Benutzer-ID (oder Ihren Benutzernamen) in Ihren Sitzungsvariablen speichern. Wenn Sie einen neuen Datensatz in der Story-Tabelle erstellen, verwenden Sie die Benutzer-ID aus Ihrer Sitzung Das story.user_id-Attribut.

Ich hoffe, es hilft.

+0

Danke für die Antwort. Aber ich muss die Dinge in der Lehre tun. – Sujith

0

Ich wäre hilfreich, wenn Sie Ihre Zugehörigkeiten beifügen.

Aber ich nehme an, dass es ein ähnliches Problem für mich ist. Sie können die @Id und @ManyToOne nicht zusammen in einem Feld definieren. Sie müssen separate Felder für eine @Id und für die Beziehung @ManyToOne verwenden.

Wenn Sie eine neue (noch nicht persistent) Benutzereinheit haben, müssen Sie Benutzer mit cascade = {"persist"} oder cascade = {"all"} im Feld der Entity Story beibehalten. Sie können die Story-Entität nur speichern, wenn der Benutzer bereits vorhanden ist und an Doctrine angehängt ist.

Ich hoffe, es hilft.

+0

Hallo, bin angehängt die Entitäten. Ich überprüfte das Schema von Doktrin generiert und seine Einstellung gut. Wenn ich die Details der Story-Entität abrufen, sollte ich die Details der Benutzereinheit erhalten, da die user_id ein Fremdschlüssel ist. – Sujith

23

Sie bestehen wahrscheinlich die Story-Entity, aber nicht den Benutzer. Wenn Sie so etwas wie diese:

$story = new Story(); 
$user = new User(); 
$story->setUser($user); 
$em->persist($story); 
$em->flush(); 

Dies führt zu einem schwerwiegenden Fehler führen, da Sie eine Einheit sind persistierende, sondern durch ihre Beziehungen findet Lehre wieder eine neue Einheit.Sie haben zwei Möglichkeiten:

Anruf auf beiden Einheiten bestehen:

$story = new Story(); 
$user = new User(); 
$story->setUser($user); 
$em->persist($story); 
$em->persist($user); 
$em->flush(); 

Oder einrichten Kaskadierung bestehen für die Geschichte Einheit. Z.B. wenn Sie Annotation-Mapping verwenden, würden Sie so etwas wie

/** 
* @ManyToOne(targetEntity="User", mappedBy="stories", cascade={"persist"}) 
*/ 
private $author; 

Das Kapitel 8. Working with associations Details tun.

+0

hi, ich möchte keine persistenten Operationen in der Benutzertabelle machen. Sie müssen nur in story entity.But wenn i die Details der Story-Entity abrufen Ich sollte die Details der User-Entity erhalten, da die User-ID ein Fremdschlüssel ist – Sujith

+4

Das gleiche Problem für mich. Meine Benutzer-Entität kommt von einer Ergebnis-Cache-Abfrage und ist daher DETACHED. Ich möchte neue Storys erstellen, ohne den Benutzer zu fusionieren, um MANAGED zu machen. Das ist auch das, was Sujith fragt. Gibt es so etwas wie einen Parameter "cascade = {ignore}"? – andig

0

Dont denken, Sie User anstatt Userid für story

$user = new User(); 
$user->setUserId($id); 
$story = new Story(); 
$story->setContent("...."); 
$story->setUser($user); //change here 
$this->em->persist($story); 
$this->em->flush(); 
3

K. Norbert Antwort trifft den Punkt gesetzt sollte, aber es ist etwas, das unklar sein könnte. Zumindest war es mir unklar, wer von SQL zur Doktrin kam.

Die Sache ist Doktrin scheinen sich zu erinnern, welche Objekte bereits bestehen. Immer, wenn neue (noch nicht persistent) Objekte gefunden werden, die sich auf die Entität beziehen, die Sie persistieren möchten - es ruft mit 'Eine neue Entität wurde durch die Beziehung gefunden ...' auf. Wenn Sie ein neues Objekt speichern möchten (nur eine Entität, ohne persistente verbundene Entitäten), müssen Sie nur sicherstellen, dass verwandte Entitäten bereits persistent sind. So :

$story = new Story(); 
$entityManager->find('User', $id); 
$story->setUser($user); 
$em->persist($story); 
$em->flush(); 

funktioniert der Trick. Weil die Doktrin weiß, dass der Benutzer bereits existiert und es nicht mehr tun muss. Doctrine weiß, weil wir den Benutzer aus der Datenbank bekommen haben.

Verwandte Themen