我有以下数据库结构。
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
这些表格现在完全可以管理这种关系。但现在,我需要另一个功能。
我需要创建一个新的表单/结构/无论你告诉我每行设置两个额外的字段:status
和comment
以及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
显示date
,servicio_id
和{id}
的字段(cliente_id
)
我认为如果你知道Symfony2就很容易,但我完全迷失了...用简单的PHP(没有框架)我设法处理这种情况并且它正在工作,但我不知道如何使用Symfony2
其他信息:
处理cliente_servicio
关系的表manyToMany
未映射到Symfony2上,因为它是doctrine:schema:update --force
自动生成的,因为它缺少id主键而无法映射({1}}它只有cliente_id
和servicio_id
)
更新
好的,做Doctrine2: Best way to handle many-to-many with extra columns in reference table所以我现在有m:1和1:m与cliente
和servicio
的中间实体的关系clienteservicio
我发现我无法从servicio
表单cliente
分配cliente
。
均不来自servicio
表格。
我可以<{1}}来自ClienteServicio
新创建的实体,即“中间”实体。 但是,我无法为之前的servicio
选择多个cliente
。
此外,重点是在一个表单中,X行包含estado
,comentario
和date
字段,其中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
包含一行
我现在正在做的事情,不是我想要的方式......
答案 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表单上只有一个服务。这应该仍然有用。