Doktrin Eins-zu-Viele-Beziehung spart nicht - Verletzung der Integritätsbeschränkung
Ich versuche, Doctrine ORM Associations zu verwenden. Ich habe mehrere Tutorials und die Online-Dokumentation gelesen, aber es funktioniert nicht und ich bin mir ehrlich gesagt nicht sicher, was ich hier falsch mache. Meine Experimente mit Doctrine scheinen ein Hit oder Miss zu sein. Jede Hilfe wäre dankbar.
Ich hätte gerne eine User-Entität und eine UserHistory-Entität mit mehreren Zeilen für einen einzelnen Benutzer. Das klingt für mich nach Eins-zu-Viele. Ich brauche es nicht unbedingt, um bidirektional zu sein.
Das Problem, das beim Hinzufügen eines Verlaufselements zu einem Benutzer auftritt, führt zu einem Fehler, wenn der Benutzer gespeichert wird, da die user_id-Spalte nicht in der user_history-Tabelle festgelegt ist.
Einheiten:
# Entity\User.php
<?php
namespace Application\Entity;
use Doctrine\ORM\Mapping as ORM;
use Doctrine\Common\Collections\ArrayCollection;
/**
* @ORM\Entity
*/
class User
{
/**
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
* @ORM\Column(type="integer")
*/
protected $id;
/**
* @ORM\Column(type="string",length=255)
*/
protected $username;
/**
* @ORM\OneToMany(targetEntity="UserHistory", mappedBy="user", cascade={"persist","remove"})
* @ORM\JoinColumn(name="id", referencedColumnName="user_id")
*/
protected $history;
public function __construct()
{
$this->setHistory(new ArrayCollection());
}
public function getHistory()
{
return $this->history;
}
}
# Entity\UserHistory.php
<?php
namespace Application\Entity;
use Doctrine\ORM\Mapping as ORM;
/**
* @ORM\Entity
* @ORM\Table(name="user_history")
*/
class UserHistory
{
/**
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
* @ORM\Column(type="integer")
*/
protected $id;
/**
* @ORM\ManyToOne(targetEntity="User")
* @ORM\JoinColumn(name="user_id", referencedColumnName="id", nullable=false)
*/
protected $user;
public function getUser()
{
return $this->user;
}
}
In meinem Controller versuche ich Folgendes:
$em = $this->getUserService()->getEntityManager();
$user = $em->find('Picpara\Entity\User', 1);
$history = new UserHistory();
$user->getHistory()->add($history);
$em->persist($user);
$em->flush();
All dies führt zu einer Verletzung der Integritätsbedingungen.
Doctrine \ DBAL \ DBALException
Datei: /myproject/vendor/doctrine/dbal/lib/Doctrine/DBAL/DBALException.php:91
Botschaft:
Bei der Ausführung von 'INSERT INTO user_history (user_id) VALUES (?)' Mit params [null] ist eine Ausnahme aufgetreten:
SQLSTATE [23000]: Verletzung der Integritätsbedingung: 1048 Die Spalte 'Benutzer-ID' darf nicht null sein
Wie ich schon sagte, ich habe mich hier auf SO umgegraben, gegoogelt und versucht, Dinge in den Anmerkungen zu bewegen. Das ist soweit ich komme. Ich bin mir nicht sicher, was ich falsch mache. Kann jemand helfen?