Symfony getName()在控制器内部无法正常工作

时间:2013-06-07 19:13:46

标签: php symfony symfony-2.1

我正在尝试在我的控制器中访问getName(),但它无法正常工作。

不会工作:

 $supplier = $em->getRepository('WICSupplierBundle:Supplier')->findBy(array('account'=>$account_id, 'id'=>$id));
 $supplierName = $supplier->getName();
 This doesnt return the name from the db....
 I get the error: "Error: Call to a member function getName() on a non-object..."

DOES 有效:

 $supplier = $em->getRepository('WICSupplierBundle:Supplier')->find($id);
 $supplierName = $supplier->getName();
 This returns the name from the db....

为什么呢?

5 个答案:

答案 0 :(得分:5)

findBy返回一个数组,而不是一个对象。你的意思是findOneBy?

http://docs.doctrine-project.org/en/2.0.x/reference/working-with-objects.html#querying

答案 1 :(得分:1)

因为“findBy”返回一个集合/数组。在你的工作实例(找到);它只查找ID字段引用的精确“一”结果,您可以直接从定义的变量中调用getters(getName())。

或者您可以使用findOneBy查看不同条件下的结果。

如果您想获得不同的供应商名称,则必须使用foreach函数来访问每个实体。

例如:

foreach($supplier as $s)
{
   echo $s->getName();
}

答案 2 :(得分:0)

为了扩展Jessica的答案,findBy()存储库方法将返回一个对象数组,这些对象是Supplier实体的实例,而find()将返回单个实体。如果您只期望一个,只需在第一个上调用getName方法。

$suppliers = $em->getRepository('WICSupplierBundle:Supplier')
    ->findBy(array(
        'account' => $account_id,
        'id'      => $id
    ));

if (count($suppliers) < 1) {
    // Assuming the code is in a controller
    throw $this->createNotFoundException('No such supplier found.'); 
}

$supplierName = $suppliers[0]->getName();

或者更好,findOneBy()

$supplier = $em->getRepository('WICSupplierBundle:Supplier')
    ->findOneBy(array(
        'account' => $account_id,
        'id'      => $id
    ));

if (!$supplier) {
    throw $this->createNotFoundException('No such supplier found.'); 
}

$supplierName = $supplier->getName();

答案 3 :(得分:0)

替换它:

$supplier = $em->getRepository('WICSupplierBundle:Supplier')->findBy(array('account'=>$account_id, 'id'=>$id));
$supplierName = $supplier->getName();

使用:

$supplier = $em->getRepository('WICSupplierBundle:Supplier')->findOneBy(array('account'=>$account_id, 'id'=>$id));
$supplierName = $supplier->getName(); 

答案 4 :(得分:-2)

我环顾四周,我认为你需要使用多个阵列,

$supplier = $em->getRepository('WICSupplierBundle:Supplier')
->findBy(
array('account'=>$account_id),  ##  array 1 
array('id'=>$id)                ##  array 2
);

$ supplierName = $ supplier-&gt; getName();
更新: 好了再次重新阅读documentation后,我发现第二个数组是用于排序的。