教义 findOneBy 方法不起作用
Posted
技术标签:
【中文标题】教义 findOneBy 方法不起作用【英文标题】:Doctrine findOneBy method not working 【发布时间】:2012-08-09 13:59:20 【问题描述】:我正在创建只有两个实体 Order 和 Shipment 的小型应用程序。
Shipment 实体如下:(删除方法以保持简短)
/**
* @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;
在我的控制器中,我尝试使用order_id
进行查询,但我的findOneByOrderId
方法不起作用。
$orderExists = $this->getDoctrine()
->getRepository('ShipBundle:Shipment')
->findOneByOrderId($orderId);
var_dump($orderExists); die();
我得到的错误是:
Entity 'ShipBundle\Entity\Shipment' has no field 'orderId'. You can therefore not call 'findOneByOrderId' on the entities' repository.
如果我没记错的话,Doctrine find
方法在下划线处加入变量并将它们大写。我做错了什么?
【问题讨论】:
那不应该是 findOneById() 吗? 你有order_id的getter吗?由于这是一个私有属性,如果您没有 getOrderId() 方法,您将无法访问它 @Carlos 感谢您的回复。我有所有的 getter setter 方法。我没有发布它们以保持问题简短。我在问题中提到了这一点。 @Cups 不,我不这么认为。 findOneById 将用于通过 id 而不是 order_id 进行查询。 尝试->findOneBy('orderId'=> $orderId); 【参考方案1】:您可以使用 Doctrine2 的内置关系功能,而不是手动在您的实体 Shipment 中使用订单 ID 这样你就会有一个 Doctrine 知道的关系。
$orders = $shipment->getOrders();
看这里:http://docs.doctrine-project.org/projects/doctrine-orm/en/2.0.x/reference/association-mapping.html
【讨论】:
感谢您的回答。但是在我的实体中,两个实体之间没有任何关系。我只需要使用它的 order_id 变量查询我的 Shipment 实体。【参考方案2】:我设法通过 pomaxa 和 Doctrine2 文档的提示解决了这个问题。
正确的代码是:
$orderExists = $this->getDoctrine()
->getRepository('ShipBundle:Shipment')
->findOneBy(array('order_id' => $orderId));
解释于:http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/reference/working-with-objects.html#by-simple-conditions
感谢大家的帮助。我很感激。
【讨论】:
【参考方案3】:这一行的问题
私人 $order_id;
使用它
私人 $orderId;
没关系。对于 db,您将拥有 order_id。
【讨论】:
确实你需要遵循 Symfony 和 Doctrine 的约定,否则事情就不会很好。【参考方案4】:澄清一下,错误的原因是您需要将一个数组传递给findOneBy();
这是错误的:,->findOneByOrderId($orderId);
in
$orderExists = $this->getDoctrine()
->getRepository('ShipBundle:Shipment')
->findOneByOrderId($orderId);
必须传递一个数组。 array('order_id' => $orderId)
$orderExists = $this->getDoctrine()
->getRepository('ShipBundle:Shipment')
->findOneBy(array('order_id' => $orderId));
或简写['order_id'=> $orderId]
,只要您使用的是 php >= 5.4
$orderExists = $this->getDoctrine()
->getRepository('ShipBundle:Shipment')
->findOneBy(['order_id'=> $orderId]);
【讨论】:
没有错,他可以同时使用。 findOneByXyz() 接受标量。问题是字段名称 $order_id 应该是 $orderId。以上是关于教义 findOneBy 方法不起作用的主要内容,如果未能解决你的问题,请参考以下文章
教义 ORM\Table(name="name") 不起作用