у меня есть схема базы данных спортивных турниров, как это
здесь doman
имеет one to many
родство с tournament
, у меня есть domain
форма, которая собирает информацию о домене и сохраняет его в базе данных, у меня есть таблица турниров и доменов, как это
tournament table
+-------------+--------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------------+--------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| domain_id | int(11) | YES | MUL | NULL | |
| description | longtext | NO | | NULL | |
+-------------+--------------+------+-----+---------+----------------+Domain Table
+-----------+--------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-----------+--------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| subdomain | varchar(255) | NO | | NULL | |
+-----------+--------------+------+-----+---------+----------------+
у меня есть tournamentType
который собирает детали турнира, но при представлении, очевидно, будет null
значение для domain_id
, как установить значение домена для всех tournaments
который будет создан, чтобы сказать domain_id = 1
,
я мог бы сделать это в контроллере, используя сеттеры, но это было бы грязно, есть ли способ установить one
сторона от many
сторона в Symfony вложенных форм,
редактировать: сейчас я делаю это внутри контроллера
$tournament->setDomain($em->getRepository("CricketBundle\Model\Entity\Domain")->findOneById(1));
$em->persist($tournament);
$em->flush();
и внутри сеттер турнирного объекта
public function setDomain(\CricketBundle\Model\Entity\Domain $domain = null)
{
$domain->addTournament($this);
$this->domain = $domain;
return $this;
}
все работает отлично, я просто не хочу использовать сеттер внутри контроллера, я хочу переместить его куда-нибудь еще
Вы всегда можете просто установить идентификатор домена по умолчанию для своей турнирной таблицы в базе данных и позволить базе данных обработать его для вас.
Другим вариантом будет использование доктрины слушатель сущностей на вашем турнирном объекте на prePersist
событие, которое происходит только до того, как эта сущность вставляется в базу данных в первый раз, а не при обновлении. Symfony имеет некоторую документацию о том, как это сделать. Более ранние версии Doctrine не поддерживали прослушиватели для одной сущности и требовали от вас прослушивания событий для всего менеджера сущностей, а затем проверяли, была ли это нужная сущность, которую вы хотели, но я собираюсь предположить, что вы включены последние версии.
Итак, сначала вы должны определить прослушиватель вашего объекта Tournament как службу в любом загружаемом файле конфигурации:
services:
listener.tournament_entity:
class: CricketBundle\EventListener\TournamentListener
tags:
- { name: doctrine.orm.entity_listener }
Тогда вы создадите свой TournamentListener:
<?php
namespace CricketBundle\EventListener;
use Doctrine\ORM\Event\LifecycleEventArgs;
use CricketBundle\Model\Entity\Tournament;
class TournamentListener
{
public function prePersist(Tournament $tournament, LifecycleEventArgs $eventArgs)
{
$em = $eventArgs->getEntityManager();
$domain = $em->getRepository('CricketBundle\Model\Entity\Domain')->find(1);
$tournament->setDomain($domain);
}
}
В вашей форме tournamentType
Код формы, необходимо добавить / заменить следующий код:
$builder->add('domain', 'entity', array(
'class' => "YourBundle:DomainClass",
'empty_data' => '1')
);
Этот код инициализирует ваше поле для первого домена.
Если вы хотите, чтобы ваше поле было скрыто в форме, вы должны изменить тип поля на hidden
,