我有像这样的体育锦标赛数据库模式
此处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
。
我可以使用setter在控制器中执行此操作,但这样做会很麻烦,有没有办法在symfony嵌入表单中设置one
端{/ 1}}端,
编辑:现在我在控制器内部这样做
many
和锦标赛实体的内置者
$tournament->setDomain($em->getRepository("CricketBundle\Model\Entity\Domain")->findOneById(1));
$em->persist($tournament);
$em->flush();
每件事情都很棒,我只是不想在控制器内使用setter,我想把它移到其他地方
答案 0 :(得分:2)
您可以随时在数据库中的锦标赛表上设置默认域ID,并让数据库为您处理。
另一种选择是在prePersist
事件上的锦标赛实体上使用Doctrine entity listener,该事件仅在该实体首次插入数据库之前发生,而不是在更新时发生。 Symfony has some documentation关于如何做到这一点。早期版本的Doctrine不支持单个实体上的侦听器,并且要求您监听整个实体管理器的事件,然后检查它是否是您想要的正确实体,但我会假设您正在使用最新版本。
因此,首先您要将锦标赛实体上的侦听器定义为正在加载的任何配置文件中的服务:
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);
}
}
答案 1 :(得分:1)
在表单tournamentType
表单代码中,您需要添加/或替换以下代码:
$builder->add('domain', 'entity', array(
'class' => "YourBundle:DomainClass",
'empty_data' => '1')
);
此代码将您的字段初始化为第一个域。
如果您希望字段隐藏在表单中,则必须将字段类型更改为hidden
。