如何在symfony2

时间:2016-01-05 11:05:07

标签: php symfony symfony-forms symfony-2.8

我有像这样的体育锦标赛数据库模式

enter image description here

此处domanone to manytournament相关联,我有一个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,我想把它移到其他地方

2 个答案:

答案 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