Sofian
Sofian

Reputation: 131

Insert into a symfony 3 table

I need to make a simple insertion in the database,

Here is the code in the controller:

    public function verifCreateOrder(Request $req){
        $store = 1;
        $provider =2;
        $creation =  $creation_start = $req->get('creation_start');
        $delivery = $creation_start = $req->get('creation_start');

        $em = $this->getDoctrine()->getManager();

        $order = new OrderList();
        $order->setNumStore($store);
        $order->setNumProvider($provider);
        $order->setCreation($creation);
        $order->setDelivery($delivery);

        $em->persist($order);
        $em->flush();
        die();
        return $this->redirectToRoute('search.view');
    }

The code of the OrderList entity :

class OrderList
{
    /**
     * @var int
     *
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;

    /**
     * @var int
     *
     * @ORM\ManyToOne(targetEntity="Provider")
     * @ORM\JoinColumn(name="num_provider", referencedColumnName="id")
     */
    private $numProvider;

    /**
     * @var int
     *
     * @ORM\ManyToOne(targetEntity="Store")
     * @ORM\JoinColumn(name="num_store", referencedColumnName="id")
     */
    private $numStore;

    /**
     * @return int
     */
    public function getNumStore()
    {
        return $this->numStore;
    }

    /**
     * @param int $numStore
     */
    public function setNumStore($numStore)
    {
        $this->numStore = $numStore;
    }

    /**
     * @var \DateTime
     *
     * @ORM\Column(name="creation", type="date")
     */
    private $creation;

    /**
     * @var \DateTime
     *
     * @ORM\Column(name="delivery", type="date")
     */
    private $delivery;

    /**
     * @var \DateTime
     *
     * @ORM\Column(name="last_update", type="date", nullable=true)
     */
    private $lastUpdate;

    /**
     * @var \DateTime
     *
     * @ORM\Column(name="emission", type="date", nullable=true)
     */
    private $emission;

    /**
     * @var int
     *
     * @ORM\Column(name="reduction_1", type="integer", nullable=true)
     */
    private $reduction1;

    /**
     * @var int
     *
     * @ORM\Column(name="reduction_2", type="integer", nullable=true)
     */
    private $reduction2;

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

Here is the error returned by symfony:

Expected value of type "AppBundle\Entity\Provider" for association field "AppBundle\Entity\OrderList#$numProvider", got "integer" instead.

Please help me resolve this error.

Upvotes: 0

Views: 2517

Answers (2)

some_guy
some_guy

Reputation: 390

I am also new to php but, you set $provider to be a integer = 2, and your relation expect object Provider $provider.

Upvotes: 1

Ivan Kalita
Ivan Kalita

Reputation: 2287

You are mixing the Doctrine relation and database foreign key concepts (they are very close, but not the same). The problem is that you can't treat related entity identifier as related entity in Doctrine. You need to pass whole related entity and not just foreign key.

There are at least two solutions:

  1. Instead of passing identifier of store (1) and identifier of provider (2), firstly retrieve this entities from the database ($em->find(...)).
  2. You can trick doctrine with getReference method, that should return you a proxy of needed object with id ($em->getReference('Path\To\Store', 1 and $em->getReference('Path\To\Provider', 2).

If you want more information, you can check these docs: reference proxies and relations.

public function verifyCreateOrder(Request $req){
    $storeId = 1;
    $providerId = 2;
    $creation =  $creation_start = $req->get('creation_start');
    $delivery = $creation_start = $req->get('creation_start');

    $em = $this->getDoctrine()->getManager();
    // getting references
    $store = $em->getReference(Store::class, $storeId);
    $provider = $em->getReference(Provider::class, $providerId);

    $order = new OrderList();
    $order->setNumStore($store);
    $order->setNumProvider($provider);
    $order->setCreation($creation);
    $order->setDelivery($delivery);

    $em->persist($order);
    $em->flush();
    die();
    return $this->redirectToRoute('search.view');
}

Upvotes: 2

Related Questions