0

我有以下数据库结构。

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(如果实体的必要字段可以是客户端名称nombrecliente并且{date}是日期,在这个页面索引上,它将显示记录的数据(我想创建但我没有创建的数据知道如何)对于选定的给定日期cliente_id

在操作上,new表单将显示一个字段estado,用于分配给( )commentdateservicio_id{id}cliente_id

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

附加信息:

cliente_servicio处理关系的表manyToMany未在 Symfony2 上映射,因为它是自动生成的,doctrine:schema:update --force因此无法映射,因为它缺少 id 主键(它只有cliente_idand servicio_id

更新

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

  • 我发现我无法从表单中分配servicio给。clientecliente

  • 也不从servicio形式。

  • 我可以从新ClienteServicio创建的实体,即“中间”实体。但是,我不能serviciocliente像以前那样为一个选择多个。

此外,重点是在一个单一的形式中,X 行带有estadocomentario以及其中 X =分配给给定date的数量的字段serviciocliente

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

正如我所说,重点是分配servicioclientefromcliente表单。

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

我现在的方式,不是我想要的方式......

4

1 回答 1

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() 做一些类似的模拟;

另一种选择是您只需要采用您的表格并在您的客户表格上有多个客户服务,然后在每个客户服务表格上只有一项服务。这应该仍然有效。

于 2013-09-19T08:49:35.807 回答