![](/img/trans.png)
[英]In Symfony, how do I translate an associated field (foreign key) in an entity?
[英]Foreign Key in Doctrine (Symfony). How do I bind a new child to an already existing parent?
有一個地區和城市的數據庫。 地區和城市表之間的關系是一對多的。 下面是我在數據庫中添加新城市的代碼。 它給出了一個錯誤:
https://i.stack.imgur.com/LZPjz.png
我在網上只找到了一種解決方案——不僅在城市上使用“$ entity_manager->persist()”,在區域上也可以使用。 但在這種情況下,Doctrine 復制了數據庫中已經存在的區域。
Symfony 文檔確實涵蓋了添加新孩子和新父母,我不需要。
在 Controller 中:
/**
* @Route("/admin/insert/city", name="city")
*/
public function city(Request $request)
{
// get list of regions
$regions_in_database = $this->getDoctrine()->getRepository(Region::class)->findAll();
// add the regions into an array
$regions = [];
foreach ($regions_in_database as $region) {
$regions[(string)$region->getName()] = clone $region;
}
// Create Form
$city = new City();
$insert_city = $this->createForm(InsertCityType::class, $city, [
'regions_array' => $regions,
]);
// Checking for the existence of regions
if (!$regions_in_database) {
$insert_city->addError(new FormError("Отсутствуют регионы!
Пожалуйста, перейдите по ссылке /insert/region и добавьте соответствующий регион"));
}
// Отправка формы
$insert_city->handleRequest($request);
if ($insert_city->isSubmitted() && $insert_city->isValid()) {
// Check if there is already such a city in the database
$repository = $this->getDoctrine()->getRepository(City::class);
$city_in_database = $repository->findOneBy(
[
'name' => $city->getName(),
'region' => $city->getRegion(),
]
);
// If the city is in the database, throw an error
if ($city_in_database) {
$insert_city->addError(new FormError('Такой город уже существует!'));
}
else {
$entity_manager = $this->getDoctrine()->getManager();
$entity_manager->persist($city);
$entity_manager->flush();
$city = new City();
$insert_city = $this->createForm(InsertCityType::class, $city, [
'regions_array' => $regions,
]);
}
}
return $this->render('admin/insert/city/city.html.twig', [
'insert_city' => $insert_city->createView(),
]);
}
表格 Class:
class InsertCityType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('name')
->add('region', ChoiceType::class, [
'choices' => $options['regions_array'],
])
;
}
public function configureOptions(OptionsResolver $resolver)
{
$resolver->setDefaults([
'data_class' => Cities::class,
'regions_array' => null,
]);
$resolver->setAllowedTypes('regions_array', 'array');
}
}
形式:
https://i.stack.imgur.com/1hGv0.png
區域 Class:
/**
* Regions
*
* @ORM\Table(name="regions")
* @ORM\Entity
*/
class Regions
{
/**
* @var int
*
* @ORM\Column(name="id", type="integer", nullable=false)
* @ORM\Id
* @ORM\GeneratedValue(strategy="IDENTITY")
*/
private $id;
/**
* @var string
*
* @ORM\Column(name="name", type="string", length=255, nullable=false)
*/
private $name;
public function getId(): ?int
{
return $this->id;
}
public function getName(): ?string
{
return $this->name;
}
public function setName(string $name): self
{
$this->name = $name;
return $this;
}
}
城市 Class:
/**
* Cities
*
* @ORM\Table(name="cities", indexes={@ORM\Index(name="region", columns={"region"})})
* @ORM\Entity
*/
class Cities
{
/**
* @var int
*
* @ORM\Column(name="id", type="integer", nullable=false)
* @ORM\Id
* @ORM\GeneratedValue(strategy="IDENTITY")
*/
private $id;
/**
* @var string
*
* @ORM\Column(name="name", type="string", length=255, nullable=false)
*/
private $name;
/**
* @var \Regions
*
* @ORM\ManyToOne(targetEntity="Regions", inversedBy="cities")
* @ORM\JoinColumns({
* @ORM\JoinColumn(name="region", referencedColumnName="id")
* })
*/
private $region;
public function getId(): ?int
{
return $this->id;
}
public function getName(): ?string
{
return $this->name;
}
public function setName(string $name): self
{
$this->name = $name;
return $this;
}
public function getRegion(): ?Regions
{
return $this->region;
}
public function setRegion(?Regions $region): self
{
$this->region = $region;
return $this;
}
}
遵循這些步驟:創建一個新城市,獲取正確的區域,然后將新城市添加到該區域並將其保存到您的數據庫中。
為此,在您的 Region 實體中添加城市列表,如下所示:
/**
* @var ArrayCollection
*
* @ORM\OneToMany(targetEntity="City", mappedBy="region", cascade={"persist"})
*/
private $cities; // This attribut will not appear in your database
public function __construct() {
$this->cities = new ArrayCollection();
}
使用此命令php bin/console make:entity --regenerate
生成資產和吸氣劑。
現在,您可以在區域中添加城市:
$theRegion = fetchMyRegion(); // Fetch the region that you want
$theRegion->addCity($myCity); // Don't forget 'cities' attribut is a ArrayCollection
$entity_manager->persist($theRegion); // City object saves automatically in your database
$entity_manager->flush(); // The new city is now created and linked to the region
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.