Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

Problema ao Inserir com Duas Tables

Olá, Não uso Zend, mas uso Doctrine, então a dúvida é válida.

Eu tenho Duas Classes Filhas (Enterprise e BossSector) e uma referência para cada noutra classe (Sector).

Enterprise.php

/**
 * @Entity
 * @Table(name="Empresa")
 * <b>Enterprise</b>
 * Classe POJO que mantêm o Nome da Empresa(ou Hospital)
 */
class Enterprise extends EntityAbstract
{
    /**
     * @var integer @Id
     *      @Column(name="id", type="integer")
     *      @GeneratedValue(strategy="AUTO")
     */
    protected $id;

    /**
     * @var String
     *      @Column(name="nm_empresa", type="string", length=255)
     */
    protected $name;

    public function __construct($id = 0, $name = "")
    {
        $this->id = $id;
        $this->name = $name;
    }

BossSector.php

* @Entity
 * @Table(name="Responsavel_Setor")
 * <b>BossSector</b>
 * Classe POJO que contém os atributos de um Chefe de Setor,
 * consistindo no seu Nome e E-mail
 */
class BossSector extends EntityAbstract
{
    /**
     * @var integer @Id
     *      @Column(name="id", type="integer")
     *      @GeneratedValue(strategy="AUTO")
     */
    protected $id;

    /**
     * @var String
     *      @Column(name="nm_responsavel", type="string", length=255)
     */
    protected $name;

    /**
     * @var String
     *      @Column(type="string", length=255)
     */
    protected $email;

    public function __construct($id = 0, $name = "", $email = "") {
        $this->id = $id;
        $this->name = $name;
        $this->email = $email;
    }

Sector.php

/**
 * @Entity
 * @Table(name="Setor")
 * <b>Sector</b>
 * Classe POJO responsável por manter os atributos da tabela Setor,
 * onde constam o Nome do Setor, o Objeto dos Chefes de Setor(BossSector)
 * e Objeto com as Empresas(Enterprise)
 */
class Sector extends EntityAbstract
{
    /**
     * @var integer @Id
     *      @Column(name="id", type="integer")
     *      @GeneratedValue(strategy="AUTO")
     */
    protected $id;

    /**
     * @var String
     *      @Column(name="nm_setor", type="string", length=255)
     */
    protected $name;

    /**
     * @ManyToOne(targetEntity="BossSector",cascade={"persist", "remove"})
     * @JoinColumn(name="id_responsavel_setor")
     */
    protected $BossSector;

    /**
     * @ManyToOne(targetEntity="Enterprise",cascade={"persist", "remove"})
     * @JoinColumn(name="id_empresa")
     */
    protected $Enterprise;

    public function __construct($enterprise, $bossSector, $name = "", $id = 0) {
        $this->id = $id;
        $this->BossSector = $bossSector;
        $this->Enterprise = $enterprise;
        $this->name = $name;
    }

E ao tentar inserir um novo Sector( ) ele insere uma nova linha para cada uma das Classes Filhas, no lugar de fazer referência.

Exemplo:

Enterprise: id:1, name:GustavoLTDA
BossSector: id:2 name="Gustavo"

Entao sento inserir novo setor
Sector: id:1, id_enterprise:2, id_bossSector:2

e uma nova linha com id: 2 "vazio" em cada uma das tabelas

Código da Model:

        $e = new Enterprise(1, "GustavoLTDA");
        $b = new BossSector(1, "Gustavo");

        $s = new Sector($e, $b, 'ti');
        $this->em->persist($s);
        $this->em->flush();
1 resposta
solução!

Resolvi!

Era necessário obter uma representação daquele resultado que estava inserindo, utilizando

getRepository(PATH)->find(id)

E após inserindo no new da nova linha. Resultado final ficou assim.

$enterpriseRepository = $this->em->getRepository('HospitalApi\Entity\Enterprise');
            $sectorRepository = $this->em->getRepository('HospitalApi\Entity\Sector');
            $eventRepository = $this->em->getRepository('HospitalApi\Entity\Event');

            $enterprise = $enterpriseRepository->find($data->enterprise);
            $sector = $sectorRepository->find($data->setor);
            $event = $eventRepository->find($data->event);

            $adverseEvent = new AdverseEvents($enterprise, $sector, $event);
            $adverseEvent
                ->mustReturn($data->mustReturn)
                ->setComplement($data->complement)
                ->setPatient($data->patient);
            $this->em->perist($adverseEvent);
            $this->em->flush();

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software