1

我有一个像这样的体育锦标赛数据库架构

在此处输入图像描述

这里domanone 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收集锦标赛详细信息的文件,但提交后显然会有一个nulldomain_id。我如何为tournaments将要创建的所有内容设置域值让我们说domain_id = 1

我可以使用 setter 在控制器中执行此操作,但这会很麻烦,有没有办法在 symfony 嵌入式表单中one从侧面设置侧面,many

编辑:现在我正在这样做,在控制器内部

$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;
    }

每件事都很好,我只是不想使用控制器内的设置器,我想将它移动到其他地方

4

2 回答 2

2

您总是可以在数据库中的锦标赛表上设置默认域 ID,并让数据库为您处理它。

另一种选择是在事件上的 Tournament 实体上使用 Doctrine实体侦听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);
    }
}
于 2016-01-05T15:26:37.890 回答
1

在您的表单tournamentType代码中,您需要添加/或替换以下代码:

$builder->add('domain', 'entity', array(
  'class' => "YourBundle:DomainClass", 
  'empty_data' => '1')
);

此代码将您的字段初始化为第一个域。

如果您希望您的字段隐藏在表单中,您必须将字段的类型更改为hidden

于 2016-01-05T13:25:00.533 回答