У меня есть база данных с таблицей Отсутствие с полями: id, date, duration, user_id, typ_id .. У меня также есть 2 таблицы User и AbsenceTyp. Все с * _id определяется как FK для соответствующей таблицы.
Я создал getters / seters и обновил свою БД следующими командами:
php app/console doctrine:generate:entities MyTestBundle php app/console doctrine:schema:update --force
(Не генерировали ошибок …)
Теперь, сохранив отсутствие:
$ab = new Absence(); $ab->setUserId(1); $ab->setDate($date); $ab->setDuration('0.5'); $ab->setTypId(2); $em->persist($ab); $em->flush();
… это приводит к этому sql-статуту:
'INSERT INTO absence (date, duration, user_id, typ_id) VALUES (?, ?, ?, ?)' with params ["2014-07-07", "0.5", null, null]:
Сети для всех FK не работают … Но Getters отлично справляются с ними (например, getTypId ()) Любые идеи? Здесь мое отсутствие-сущность:
<?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
Когда у вас есть отношение JOIN, вы должны использовать установщик объектов для установки значения объединенного столбца. Так, например, чтобы установить значение для поля user_id, вам нужно использовать set_ser ($ userObject) setter вместо setUserId ().
Фактически указание поля $ user_id в вашей организации не требуется. Иногда бывает полезно сделать это, если вам нужно получить доступ непосредственно к значению user_id во время SELECT из базы данных без необходимости извлечения пользовательского объекта.
Ваш код может выглядеть примерно так:
$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();