Doctrine2实体关系额外字段

时间:2013-09-19 07:54:22

标签: php database symfony doctrine-orm entity-relationship

我有以下数据库结构。

Pge\IncidenciasBundle\Entity\Cliente:
    type: entity
    table: cliente
    repositoryClass: Pge\IncidenciasBundle\Entity\ClienteRepository
    id:
      id:
        type: integer
        generator:
          strategy: IDENTITY
    fields:
        nombre:
            type: string
            length: 250
            fixed: false
            nullable: true   
    manyToMany:
        servicios:
            targetEntity: Servicio
            cascade: [persist]
    lifecycleCallbacks: {  }
Pge\IncidenciasBundle\Entity\Servicio:
    type: entity
    table: servicio
    id:
      id:
        type: integer
        generator:
          strategy: IDENTITY
    fields:
        nombre:
            type: string
            length: 250
            fixed: false
            nullable: true
    lifecycleCallbacks: {  }

现在,有一个名为cliente_servicio的数据库表,它保存了这两个实体之间的关系,例如一些数据:

cliente_id  servicio_id
1           1
1           4
1           8
2           1
3           3
3           7

这些表格现在完全可以管理这种关系。但现在,我需要另一个功能。

我需要创建一个新的表单/结构/无论你告诉我每行设置两个额外的字段:statuscomment以及date所以最终的DB输出将是这个:

cliente_id  servicio_id date        status  comment
1           1           2013-09-19  ok      null
1           4           2013-09-19  ko      Needs to clear
1           8           2013-09-19  ok      null
2           1           2013-09-19  ko      Packets lost (fix firewall)
3           3           2013-09-19  ko      Out of service (see ticket T9388)
3           7           2013-09-19  ok      null

关键是呼叫路由localhost/whatever/{id}/{date},其中{id}cliente_id(如果需要nombre实体的cliente},则可以是客户名称,并且{ date}是日期,在此页面索引上,它将显示所选cliente_id的给定日期的记录数据(我想要创建的数据,但我不知道如何)。

new操作中,表单会为分配给estado的每个comment显示dateservicio_id{id}的字段(cliente_id

我认为如果你知道Symfony2就很容易,但我完全迷失了...用简单的PHP(没有框架)我设法处理这种情况并且它正在工作,但我不知道如何使用Symfony2

其他信息:

处理cliente_servicio关系的表manyToMany未映射到Symfony2上,因为它是doctrine:schema:update --force自动生成的,因为它缺少id主键而无法映射({1}}它只有cliente_idservicio_id

更新

好的,做Doctrine2: Best way to handle many-to-many with extra columns in reference table所以我现在有m:1和1:m与clienteservicio的中间实体的关系clienteservicio

  • 我发现我无法从servicio表单cliente分配cliente

  • 均不来自servicio表格。

  • 我可以<{1}}来自ClienteServicio新创建的实体,即“中间”实体。 但是,我无法为之前的servicio 选择多个cliente

此外,重点是在一个表单中,X行包含estadocomentariodate字段,其中X =分配给{servicio的{​​{1}} {1}}

cliente

正如我所说,重点是<?php namespace Pge\IncidenciasBundle\Entity; use Doctrine\ORM\Mapping as ORM; /** * Cliente * * @ORM\Table(name="cliente") * @ORM\Entity(repositoryClass="Pge\IncidenciasBundle\Entity\ClienteRepository") */ class Cliente { /** * @var integer * * @ORM\Column(name="id", type="integer") * @ORM\Id * @ORM\GeneratedValue(strategy="IDENTITY") */ private $id; /** * @var string * * @ORM\Column(name="nombre", type="string", length=250, nullable=true) */ private $nombre; /** * @var \Doctrine\Common\Collections\Collection * @ORM\OneToMany(targetEntity="ClienteServicio", mappedBy="cliente") */ private $servicio; public function __toString() { return $this->nombre; } /** * Constructor */ public function __construct() { $this->servicio = new \Doctrine\Common\Collections\ArrayCollection(); } /** * Get id * * @return integer */ public function getId() { return $this->id; } /** * Set nombre * * @param string $nombre * @return Cliente */ public function setNombre($nombre) { $this->nombre = $nombre; return $this; } /** * Get nombre * * @return string */ public function getNombre() { return $this->nombre; } /** * Add servicio * * @param \Pge\IncidenciasBundle\Entity\ClienteServicio $servicio * @return Cliente */ public function addServicio(\Pge\IncidenciasBundle\Entity\ClienteServicio $servicio) { $this->servicio[] = $servicio; return $this; } /** * Remove servicio * * @param \Pge\IncidenciasBundle\Entity\ClienteServicio $servicio */ public function removeServicio(\Pge\IncidenciasBundle\Entity\ClienteServicio $servicio) { $this->servicio->removeElement($servicio); } /** * Get servicio * * @return \Doctrine\Common\Collections\Collection */ public function getServicio() { return $this->servicio; } } <?php namespace Pge\IncidenciasBundle\Entity; use Doctrine\ORM\Mapping as ORM; /** * Servicio * * @ORM\Table(name="servicio") * @ORM\Entity */ class Servicio { /** * @var integer * * @ORM\Column(name="id", type="integer") * @ORM\Id * @ORM\GeneratedValue(strategy="IDENTITY") */ private $id; /** * @var string * * @ORM\Column(name="nombre", type="string", length=250, nullable=true) */ private $nombre; /* * * @ORM\OneToMany(targetEntity="ClienteServicio", mappedBy="servicio") */ private $cliente; public function __toString() { return $this->nombre; } /** * Get id * * @return integer */ public function getId() { return $this->id; } /** * Set nombre * * @param string $nombre * @return Servicio */ public function setNombre($nombre) { $this->nombre = $nombre; return $this; } /** * Get nombre * * @return string */ public function getNombre() { return $this->nombre; } } <?php namespace Pge\IncidenciasBundle\Entity; use Doctrine\ORM\Mapping as ORM; /** * ClienteServicio * * @ORM\Table(name="cliente_servicio") * @ORM\Entity */ class ClienteServicio { /** * @var integer * @ORM\Column(name="id", type="integer", nullable=false) * @ORM\Id * @ORM\GeneratedValue(strategy="AUTO") */ private $id; /** * @var string * * @ORM\Column(name="estado", type="string", length=255, nullable=false) */ private $estado; /** * @var string * * @ORM\Column(name="comentario", type="string", length=255, nullable=false) */ private $comentario; /** * @var \DateTime * * @ORM\Column(name="fecha", type="date", nullable=false) */ private $fecha; /** * @var \Pge\IncidenciasBundle\Entity\Servicio * * @ORM\ManyToOne(targetEntity="Servicio", inversedBy="cliente") */ private $servicio; /** * @var \Pge\IncidenciasBundle\Entity\Id * * @ORM\ManyToOne(targetEntity="Cliente", inversedBy="servicio") */ private $cliente; /** * Set id * * @param integer $id * @return ClienteServicio */ public function setId($id) { $this->id = $id; return $this; } /** * Get id * * @return integer */ public function getId() { return $this->id; } /** * Set estado * * @param string $estado * @return ClienteServicio */ public function setEstado($estado) { $this->estado = $estado; return $this; } /** * Get estado * * @return string */ public function getEstado() { return $this->estado; } /** * Set comentario * * @param string $comentario * @return ClienteServicio */ public function setComentario($comentario) { $this->comentario = $comentario; return $this; } /** * Get comentario * * @return string */ public function getComentario() { return $this->comentario; } /** * Set fecha * * @param \DateTime $fecha * @return ClienteServicio */ public function setFecha($fecha) { $this->fecha = $fecha; return $this; } /** * Get fecha * * @return \DateTime */ public function getFecha() { return $this->fecha; } /** * Set servicio * * @param \Pge\IncidenciasBundle\Entity\Servicio $servicio * @return ClienteServicio */ public function setServicio(\Pge\IncidenciasBundle\Entity\Servicio $servicio = null) { $this->servicio = $servicio; return $this; } /** * Get servicio * * @return \Pge\IncidenciasBundle\Entity\Servicio */ public function getServicio() { return $this->servicio; } /** * Set cliente * * @param \Pge\IncidenciasBundle\Entity\Cliente $cliente * @return ClienteServicio */ public function setCliente(\Pge\IncidenciasBundle\Entity\Cliente $cliente = null) { $this->cliente = $cliente; return $this; } /** * Get cliente * * @return \Pge\IncidenciasBundle\Entity\Cliente */ public function getCliente() { return $this->cliente; } } servicio表格cliente。{/ p>

然后,从另一个表单中,将额外字段设置为cliente分配给servicio(如果我可以处理cliente中的servicio,那将会很棒一个表单,每个cliente包含一行

我现在正在做的事情,不是我想要的方式......

1 个答案:

答案 0 :(得分:2)

评论中的答案仍然适用。

你只需要将你的m:n关系变为am:1加1:n关系,你将得到3个实体而不是2个。只要你有3个实体,你也可以创建一个新的形式对于“中间”实体,因为它就像每个其他实体一样。

更新:

如果您向客户端添加一些逻辑,您仍然可以模拟相同的事情:

public function addService(Service $service){
     $clientService = new ClientService();
     $clientService->setClient($this);
     $clientService->setService($service);
     $this->clientService->add($clientService);
}

您可以使用getService();

进行一些类似的模拟

替代方案是您只需要采用您的表单并在您的客户端表单上有多个clientservicio,然后在每个clientservicio表单上只有一个服务。这应该仍然有用。