Aayush
Aayush

Reputation: 3098

Doctrine findOneBy method not working

I am creating small application with just two entities, Order and Shipment.

The Shipment entity is as follows: (methods removed to keep it short)

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

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

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

/**
 * @var integer $order_id
 *
 * @ORM\Column(name="order_id", type="integer")
 */
private $order_id;

/**
 * @var smallint $payment_type
 *
 * @ORM\Column(name="payment_type", type="smallint")
 */
private $payment_type;

In my controller I am trying to query using the order_id but my findOneByOrderId method is not working.

$orderExists = $this->getDoctrine()
                ->getRepository('ShipBundle:Shipment')
                ->findOneByOrderId($orderId);

var_dump($orderExists);     die();

The error I get is:

Entity 'ShipBundle\Entity\Shipment' has no field 'orderId'. You can therefore not call 'findOneByOrderId' on the entities' repository.

If I am not wrong, Doctrine find methods join the variables at underscores and capitalize them. What am I doing wrong?

Upvotes: 11

Views: 83113

Answers (4)

luminol
luminol

Reputation: 425

Just to clarify, the reason for the error was that you needed to pass an Array into the findOneBy();

This is wrong: , ->findOneByOrderId($orderId); in

$orderExists = $this->getDoctrine()
                ->getRepository('ShipBundle:Shipment')
                ->findOneByOrderId($orderId);

An array must be passed. array('order_id' => $orderId)

$orderExists  = $this->getDoctrine()
                ->getRepository('ShipBundle:Shipment')
                ->findOneBy(array('order_id' => $orderId));

OR SHORTHAND ['order_id'=> $orderId] as long as you are in PHP >= 5.4

$orderExists  = $this->getDoctrine()
                ->getRepository('ShipBundle:Shipment')
                ->findOneBy(['order_id'=> $orderId]);

Upvotes: -2

Taras  Hanych
Taras Hanych

Reputation: 171

Problem in this line

private $order_id;

Use it

private $orderId;

It is ok. For db you will have order_id.

Upvotes: 2

Aayush
Aayush

Reputation: 3098

I managed to solve the problem with the hint from pomaxa and Doctrine2 documentation.

The correct code would be:

$orderExists = $this->getDoctrine()
                ->getRepository('ShipBundle:Shipment')
                ->findOneBy(array('order_id' => $orderId));

explained at: http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/reference/working-with-objects.html#by-simple-conditions

Thanks everyone for the help. I appreciate it.

Upvotes: 25

Johannes Reiners
Johannes Reiners

Reputation: 678

You could use the inbuilt relationship capabilities of Doctrine2 instead of using an id of order in your entity Shipment manually That way you would have a relationship Doctrine is aware of.

$orders = $shipment->getOrders();

Look here: http://docs.doctrine-project.org/projects/doctrine-orm/en/2.0.x/reference/association-mapping.html

Upvotes: 2

Related Questions