User12345
User12345

Reputation: 107

Symfony Insert Foreign Key Value

I have 3 tables: EdiTradingPartner, EdiDocType and EdiTradingPartnerTransactions


src\Matrix\MatrixEdiBundle\Entity\EdiTradingPartner

namespace Matrix\MatrixEdiBundle\Entity;

use Doctrine\ORM\Mapping as ORM;

/**
 * EdiTradingPartner
 *
 * @ORM\Table(name="edi_trading_partner")
 * @ORM\Entity(repositoryClass="Matrix\MatrixEdiBundle\Repository\EdiTradingPartnerRepository")
 */
class EdiTradingPartner
{
    /**
     * @var string
     *
     * @ORM\Column(name="edi_interchange_id", type="string", length=30, nullable=false)
     */
    private $ediInterchangeId;

    /**
     * @var string
     *
     * @ORM\Column(name="tp_name", type="string", length=30, nullable=false)
     */
    private $tpName;

    /**
     * @var string
     *
     * @ORM\Column(name="tp_location", type="string", length=50, nullable=false)
     */
    private $tpLocation;

    /**
     * @var integer
     *
     * @ORM\Column(name="edi_trading_partner_id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="IDENTITY")
     */
    private $ediTradingPartnerId;



    /**
     * Set ediInterchangeId
     *
     * @param string $ediInterchangeId
     * @return EdiTradingPartner
     */
    public function setEdiInterchangeId($ediInterchangeId)
    {
        $this->ediInterchangeId = $ediInterchangeId;

        return $this;
    }

    /**
     * Get ediInterchangeId
     *
     * @return string 
     */
    public function getEdiInterchangeId()
    {
        return $this->ediInterchangeId;
    }

    /**
     * Set tpName
     *
     * @param string $tpName
     * @return EdiTradingPartner
     */
    public function setTpName($tpName)
    {
        $this->tpName = $tpName;

        return $this;
    }

    /**
     * Get tpName
     *
     * @return string 
     */
    public function getTpName()
    {
        return $this->tpName;
    }

    /**
     * Set tpLocation
     *
     * @param string $tpLocation
     * @return EdiTradingPartner
     */
    public function setTpLocation($tpLocation)
    {
        $this->tpLocation = $tpLocation;

        return $this;
    }

    /**
     * Get tpLocation
     *
     * @return string 
     */
    public function getTpLocation()
    {
        return $this->tpLocation;
    }

    /**
     * Get ediTradingPartnerId
     *
     * @return integer 
     */
    public function getEdiTradingPartnerId()
    {
        return $this->ediTradingPartnerId;
    }
}

src\Matrix\MatrixEdiBundle\Entity\EdiDocType

<?php

namespace Matrix\MatrixEdiBundle\Entity;

use Doctrine\ORM\Mapping as ORM;

/**
 * EdiDocType
 *
 * @ORM\Table(name="edi_doc_type")
 * @ORM\Entity(repositoryClass="Matrix\MatrixEdiBundle\Repository\EdiDocTypeRepository")
 */
class EdiDocType
{
    /**
     * @var integer
     *
     * @ORM\Column(name="doc_type", type="integer", nullable=false)
     */
    private $docType;

    /**
     * @var string
     *
     * @ORM\Column(name="name", type="string", length=50, nullable=false)
     */
    private $name;

    /**
     * @var string
     *
     * @ORM\Column(name="description", type="string", length=255, nullable=false)
     */
    private $description;

    /**
     * @var string
     *
     * @ORM\Column(name="direction", type="string", length=10, nullable=false)
     */
    private $direction;

    /**
     * @var integer
     *
     * @ORM\Column(name="edi_doc_type_id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="IDENTITY")
     */
    private $ediDocTypeId;



    /**
     * Set docType
     *
     * @param integer $docType
     * @return EdiDocType
     */
    public function setDocType($docType)
    {
        $this->docType = $docType;

        return $this;
    }

    /**
     * Get docType
     *
     * @return integer 
     */
    public function getDocType()
    {
        return $this->docType;
    }

    /**
     * Set name
     *
     * @param string $name
     * @return EdiDocType
     */
    public function setName($name)
    {
        $this->name = $name;

        return $this;
    }

    /**
     * Get name
     *
     * @return string 
     */
    public function getName()
    {
        return $this->name;
    }

    /**
     * Set description
     *
     * @param string $description
     * @return EdiDocType
     */
    public function setDescription($description)
    {
        $this->description = $description;

        return $this;
    }

    /**
     * Get description
     *
     * @return string 
     */
    public function getDescription()
    {
        return $this->description;
    }

    /**
     * Set direction
     *
     * @param string $direction
     * @return EdiDocType
     */
    public function setDirection($direction)
    {
        $this->direction = $direction;

        return $this;
    }

    /**
     * Get direction
     *
     * @return string 
     */
    public function getDirection()
    {
        return $this->direction;
    }

    /**
     * Get ediDocTypeId
     *
     * @return integer 
     */
    public function getEdiDocTypeId()
    {
        return $this->ediDocTypeId;
    }
}

src\Matrix\MatrixEdiBundle\Entity\EdiTradingPartnerTransactions

namespace Matrix\MatrixEdiBundle\Entity;

use Doctrine\ORM\Mapping as ORM;

/**
 * EdiTradingPartnerTransactions
 *
 * @ORM\Table(name="edi_trading_partner_transactions", indexes={@ORM\Index(name="edi_tp_id", columns={"edi_tp_id", "edi_doc_type_id"}), @ORM\Index(name="edi_transactions_id", columns={"edi_doc_type_id"}), @ORM\Index(name="IDX_F2BE50F7B9C737A1", columns={"edi_tp_id"})})
 * @ORM\Entity(repositoryClass="Matrix\MatrixEdiBundle\Repository\EdiTradingPartnerTransactionsRepository")
 */
class EdiTradingPartnerTransactions
{
    /**
     * @var integer
     *
     * @ORM\Column(name="edi_tp_transactions_id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="IDENTITY")
     */
    private $ediTpTransactionsId;

    /**
     * @var \Matrix\MatrixEdiBundle\Entity\EdiDocType
     *
     * @ORM\ManyToOne(targetEntity="Matrix\MatrixEdiBundle\Entity\EdiDocType")
     * @ORM\JoinColumns({
     *   @ORM\JoinColumn(name="edi_doc_type_id", referencedColumnName="edi_doc_type_id")
     * })
     */
    private $ediDocType;

    /**
     * @var \Matrix\MatrixEdiBundle\Entity\EdiTradingPartner
     *
     * @ORM\ManyToOne(targetEntity="Matrix\MatrixEdiBundle\Entity\EdiTradingPartner")
     * @ORM\JoinColumns({
     *   @ORM\JoinColumn(name="edi_tp_id", referencedColumnName="edi_trading_partner_id")
     * })
     */
    private $ediTp;



    /**
     * Get ediTpTransactionsId
     *
     * @return integer 
     */
    public function getEdiTpTransactionsId()
    {
        return $this->ediTpTransactionsId;
    }

    /**
     * Set ediDocType
     *
     * @param \Matrix\MatrixEdiBundle\Entity\EdiDocType $ediDocType
     * @return EdiTradingPartnerTransactions
     */
    public function setEdiDocType(\Matrix\MatrixEdiBundle\Entity\EdiDocType $ediDocType = null)
    {
        $this->ediDocType = $ediDocType;

        return $this;
    }

    /**
     * Get ediDocType
     *
     * @return \Matrix\MatrixEdiBundle\Entity\EdiDocType 
     */
    public function getEdiDocType()
    {
        return $this->ediDocType;
    }

    /**
     * Set ediTp
     *
     * @param \Matrix\MatrixEdiBundle\Entity\EdiTradingPartner $ediTp
     * @return EdiTradingPartnerTransactions
     */
    public function setEdiTp(\Matrix\MatrixEdiBundle\Entity\EdiTradingPartner $ediTp = null)
    {
        $this->ediTp = $ediTp;

        return $this;
    }

    /**
     * Get ediTp
     *
     * @return \Matrix\MatrixEdiBundle\Entity\EdiTradingPartner 
     */
    public function getEdiTp()
    {
        return $this->ediTp;
    }
}

I want to insert into EdiTradingPartnerTransactions table yet I really don't know what to do since I've been receiving this error:

Catchable fatal error: Argument 1 passed to Matrix\MatrixEdiBundle\Entity\EdiTradingPartnerTransactions::setEdiTp() must be an instance of Matrix\MatrixEdiBundle\Entity\EdiTradingPartner, string given, called in C:\xampp\htdocs\Editracker\src\Matrix\MatrixEdiBundle\Controller\MatrixController.php on line 474 and defined in C:\xampp\htdocs\Editracker\src\Matrix\MatrixEdiBundle\Entity\EdiTradingPartnerTransactions.php on line 85

Here's my function in the controller side:

public function deleteTpTransAction($tpId, $docType, $direction, $tpName) {
    $em = $this->getDoctrine()->getManager();
    $docTypeId = $em->getRepository('MatrixEdiBundle:EdiDocType')->getId($docType, $direction);

    if ($docTypeId != null) {
        $result = $em->getRepository('MatrixEdiBundle:EdiTradingPartnerTransactions')->getTpTrans($tpId, $docType, $direction);
        if ($result == null) {
            $transaction = new EdiTradingPartnerTransactions();
            $transaction->setEdiTp($tpId);
            $transaction->setEdiDocType($docTypeId);

            $em->persist($transaction);
        } else {
            foreach ($result as $key) {
                $id = $key->getEdiTpTransactionsId();
                $transaction = $em->getRepository('MatrixEdiBundle:EdiTradingPartnerTransactions')->find($id);

                $em->remove($transaction);
            }                
        }
        $em->flush();
    }
    return $this->redirect($this->generateUrl('matrix_edi_tpTrans'));
}

Any help would really be appreciated. Thanks in advanced!

Upvotes: 2

Views: 3922

Answers (2)

6be709c0
6be709c0

Reputation: 8441

Your error is because setEdiTp need an instance of EdiTradingPartner.

Your error say string given.

Because $tpId is string.

Verify

Change

$transaction->setEdiTp($tpId);

To

// $transaction->setEdiTp($tpId);
var_dump($tpId);

Normally, $tpId return a string, not a object.

So when you call deleteTpTransAction, $tpId must be an instance of setEdiTp

Changement :

$editp = $em->getRepository('MatrixEdiBundle:EdiTradingPartner')->find($tpId);

and change

$transaction->setEdiTp($tpId);

by

$transaction->setEdiTp($editTp);

Upvotes: 1

DonCallisto
DonCallisto

Reputation: 29922

The error here is pretty clear: Doctrine handle, at least for relationships, only objects of the "related" (let's call that way) entity.

When you do

$transaction->setEdiTp($tpId);
$transaction->setEdiDocType($docTypeId);

you're trying to insert ID(s) of related objects. This is an error: although your db expects an integer (foreign key), Doctrine is an abstaction "pillow" between your code and db; it choose to work with objects and not with ids(you can see it pretty clearly into entity classes files)

Solution here is pretty simple:

  • Fetch from db the entity for setEdiTp and setEdiDocType
  • Pass them to the functions

In PHP (Symfony):

$ediTp = $em
    ->getRepository('MatrixEdiBundle:EdiTp')
    ->findOneById($tpId);

$ediDocType = $em
    ->getRepository('MatrixEdiBundle:EdiDocType')
    ->findOneById($docTypeId);

then

$transaction->setEdiTp($ediTp);
$transaction->setEdiDocType($ediDocType);

Upvotes: 3

Related Questions