Symfony 2.0 Il setter delle entity framework; di Doctrine non funziona

Ho un database con una tabella Assenza con campi: id, data, durata, user_id, typ_id .. Ho anche 2 tabelle User e AbsenceTyp. Tutto con * _id è definito come FK nella tabella corrispondente.

Ho generato getter / setter e aggiornato il mio DB con i seguenti comandi:

php app/console doctrine:generate:entities MyTestBundle php app/console doctrine:schema:update --force 

(Non ha generato errori …)

Ora salvando un'assenza:

 $ab = new Absence(); $ab->setUserId(1); $ab->setDate($date); $ab->setDuration('0.5'); $ab->setTypId(2); $em->persist($ab); $em->flush(); 

… ha portto a questo statuto sql:

 'INSERT INTO absence (date, duration, user_id, typ_id) VALUES (?, ?, ?, ?)' with params ["2014-07-07", "0.5", null, null]: 

I setter per tutti gli FK non funzionano … Ma i Getters fanno le loro cose perfettamente (es. GetTypId ()) Qualche idea? Ecco la mia Entità di assenza:

 <?php namespace MyTest\Bundle\MainBundle\Entity; use Doctrine\ORM\Mapping as ORM; /** * @ORM\Entity(repositoryClass="AbsenceRepository") * @ORM\Table(name="absence", indexes={@ORM\Index(name="fk_absence_user", columns= {"user_id"}), @ORM\Index(name="fk_absence_absencetyp", columns={"typ_id"})}) */ class Absence { /** * @ORM\Id * @ORM\Column(type="integer") * @ORM\GeneratedValue(strategy="AUTO") */ protected $id; /** * @ORM\Column(type="date", nullable=false) */ protected $date; /** * @ORM\Column(type="decimal", precision=5, scale=2, nullable=false) */ protected $duration; /** * @ORM\Column(type="integer", nullable=false) */ protected $user_id; /** * @ORM\ManyToOne(targetEntity="MyTest\Bundle\UserBundle\Entity\User", inversedBy="absences") * @ORM\JoinColumn(name="user_id", referencedColumnName="id") */ protected $user; /** * @ORM\Column(type="integer", nullable=false) */ protected $typ_id; /** * @ORM\ManyToOne(targetEntity="MyTest\Bundle\MainBundle\Entity\AbsenceTyp", inversedBy="absences") * @ORM\JoinColumn(name="typ_id", referencedColumnName="id") */ protected $absenceTyp; ... // generated Getter / Setters 

Quando si ha una relazione JOIN, è necessario utilizzare il setter object per impostare il valore della colonna unita. Ad esempio, per impostare il valore per il field user_id è necessario utilizzare -> setUser ($ userObject) setter al posto di setUserId ().

Non è necessario specificare effettivamente il field $ user_id nell'entity framework;. A volte può essere utile farlo, se è necessario accedere direttamente al valore user_id durante SELECTs dal database senza wherer recuperare l'object utente.

Il tuo codice potrebbe essere simile a questo:

 $user = new User(); //fake user or real user object if you have it fetched from db already $user->setId(5); $ab = new Absence(); $ab->setUser($user); // ... set other fields $em->persist($ab); $em->flush();