Я создал Formtype UniversitaireType, но у меня есть эта ошибка:
attribut condidat_id не создается в базе данных, когда я пытаюсь выполнить команду php bin / console doctrine: schema: update —force (все атрибуты создаются в базе данных, кроме id_condidat) .. Я делаю сопоставление OneToMany $ condidat в Universitaire объекта
код объекта:
<?php
namespace AppBundle\Entity;
use Doctrine\ORM\Mapping as ORM;
use AppBundle\Entity\Condidat;
/**
* Universitaire.
*
* @ORM\Table(name="universitaires")
* @ORM\Entity(repositoryClass="AppBundle\Entity\UniversitaireEntityRepository")
*/
class Universitaire
{
/**
* @var int
*
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;
/**
* @var string
*
* @ORM\Column(name="date_start", type="string", length=255, nullable=true)
*/
private $dateStart;
/**
* @var string
*
* @ORM\Column(name="date_end", type="string", length=255, nullable=true)
*/
private $dateEnd;
/**
* @var string
*
* @ORM\Column(name="establishment", type="string", length=255, nullable=true, unique=true)
*/
private $establishment;/**
* @var string
*
* @ORM\Column(name="diploma", type="string", length=255, nullable=true, unique=true)
*/
private $diploma;
/**
*@ORM\OneToMany(targetEntity="AppBundle\Entity\Condidat",mappedBy="id_universitaire",cascade={"persist"})
*@ORM\JoinColumn(name="id_condidat", referencedColumnName="id")
*/
private $condidat;
/**
* Get id.
*
* @return int
*/
public function getId()
{
return $this->id;
}
/**
* Add Condidat
*
* @param \AppBundle\Entity\Condidat $condidat
* @return Universitaire
*/
public function addCondidat(\AppBundle\Entity\Condidat $condidat)
{
$this->condidat[] = $condidat;
return $this;
}
/**
* Remove Condidat
*
* @param \AppBundle\Entity\Condidat $condidat
*/
public function removeCondidat(\AppBundle\Entity\Condidat $condidat)
{
$this->Condidat->removeElement($condidat);
}
/**
* Get Condidat
*
* @return \Doctrine\Common\Collections\Collection
*/
public function getCondidat()
{
return $this->condidat;
}/**
* Set dateStart.
*
* @param string $dateStart
*
* @return Universitaire
*/
public function setdateStart($dateStart)
{
$this->dateStart = $dateStart;
return $this;
}
/**
* Get dateStart.
*
* @return string
*/
public function getdateStart()
{
return $this->dateStart;
}
/**
* Set dateEnd.
*
* @param string $dateEnd
*
* @return Universitaire
*/
public function setDateEnd($dateEnd)
{
$this->dateEnd = $dateEnd;
return $this;
}
/**
* Get dateEnd.
*
* @return string
*/
public function getdateEnd()
{
return $this->dateEnd;
}
/**
* Set establishment.
*
* @param string $establishment
*
* @return Universitaire
*/
public function setEstablishment($establishment)
{
$this->establishment = $establishment;
return $this;
}
/**
* Get establishment.
*
* @return string
*/
public function getEstablishment()
{
return $this->establishment;
}
/**
* Set diploma.
*
* @param string $diploma
*
* @return Universitaire
*/
public function setDiploma($diploma)
{
$this->diploma = $diploma;
return $this;
}
/**
* Get diploma.
*
* @return string
*/
public function getDiploma()
{
return $this->diploma;
}
public function __construct()
{
$this->ResponsableCategory = new \Doctrine\Common\Collections\ArrayCollection();
}
}
код FormType:
<?php
namespace AppBundle\Form;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;
use AppBundle\Entity\Universitaire;
use AppBundle\Entity\Condidat;
class UniversitaireType extends AbstractType
{
/**
* {@inheritdoc}
*/
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder->add('dateStart')->add('dateEnd')->add('establishment')->add('diploma')
->add('condidat',null, array(
'class' => 'AppBundle:Condidat',
'choice_label' => 'condidat',));
}
/**
* {@inheritdoc}
*/
public function configureOptions(OptionsResolver $resolver)
{
$resolver->setDefaults(array(
'data_class' => 'AppBundle\Entity\Universitaire',
"csrf_protection" => "false"));
}
/**
* {@inheritdoc}
*/
public function getBlockPrefix()
{
return 'appbundle_universitaire';
}}
У вас есть две ошибки в вашей собственности «condidat».
Вы использовали один-ко-многим (двунаправленный). Если вы хотите иметь только один
кандидат в «Университет» — тогда вы должны использовать One-To-One (Двунаправленный).
class Universitaire
{
## ...
/**
* Bidirectional One-To-One (Owning Side)
*
* @ORM\OneToOne(
* targetEntity="AppBundle\Entity\Condidat",
* inversedBy="universitaire",
* cascade={"persist", "remove"}
* )
* @ORM\JoinColumn(
* name="condiat_id",
* referencedColumnName="id"* )
*/
private $condidat;
class Condidat
{
## ...
/**
* Bidirectional One-To-One (Inversed Side)
*
* @ORM\OneToOne(
* targetEntity="AppBundle\Entity\Universitaire",
* mappedBy="condidat",
* )
*/
private $universitaire;
Если нет, и One-To-Many был именно тем, что вы хотели иметь, чем вы должны установить в своем __construct()
что «condidat» является коллекцией массивов
public function __construct()
{
$this->condidat = new \Doctrine\Common\Collections\ArrayCollection();
}
Если бы я был тобой, я бы предпочел использовать «кандидатов» с «s» — чтобы показать, что это arrayCollection.
Как я уже сказал, ваш пример — двунаправленный «один ко многим». В этом случае мы используем mappedBy и inversedBy. Сущность, в которой вы устанавливаете столбец Join, является владельцем. И, конечно, JoinColumn должен быть в сущности «Кандидат». Так:
class Universitaire
{
## ...
/**
* Bidirectional One-To-Many (Owning Side)
* Predicate: One Universitaire can have a lot of candidates
*
* @ORM\OneToMany(
* targetEntity="AppBundle\Entity\Condidat",
* mappedBy="universitaire",
* cascade={"persist", "remove"}
* )
*/
private $condidats;
class Condidat
{
## ...
/**
* Bidirectional Many-To-One (Owning Side)
* Predicate: Each Condidat belongs to one Universitaire
*
* @ORM\ManyToOne(
* targetEntity="AppBundle\Entity\Universitaire",
* inversedBy="condidats",
* )
* @ORM\JoinColumn(
* name="universitaire_id",
* referencedColumnName="id",
* onDelete="SET NULL"* )
*/
private $universitaire;
я добавил onDelete="SET NULL"
, Если вы удалите universitaire, то в поле universitaire каждого «condidate» вы увидите нулевое значение.
Других решений пока нет …