我有以下数据库结构。
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
重点是调用route localhost/whatever/{id}/{date}
where {id}
is 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 主键(它只有cliente_id
and 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
形式。我可以从新
ClienteServicio
创建的实体,即“中间”实体。但是,我不能servicio
cliente
像以前那样为一个选择多个。
此外,重点是在一个单一的形式中,X 行带有estado
,comentario
以及其中 X =分配给给定date
的数量的字段servicio
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
fromcliente
表单。
然后,从另一个表单中,将额外的字段设置为servicio
分配给cliente
(如果我可以在一个表单中处理每个包含servicio
一个cliente
行的每个表单,那就太好了servicio
)
我现在的方式,不是我想要的方式......