在修改时调用非对象上的成员函数

时间:2014-04-14 08:28:23

标签: php symfony doctrine

我试图更新一个值但是一旦我尝试设置它就会返回此错误

Error: Call to a member function setPGuID() on a non-object in D:\xampp\htdocs\symfony\src\CQ\IntranetBundle\Controller\DefaultController.php line 19

这是我的DefaultController的代码,因为我从Symfony2 Docs中复制了它,我没有任何可能错误的ID。

class DefaultController extends Controller {

    public function indexAction() {
        $em = $this->getDoctrine()->getManager();
        $karte = $em->getRepository('CQIntranetBundle:Karte')->findByPGuId('00f8e77c-d8c2-4c7f-8e4a-384cc7689da0');

        if (!$karte) {
            throw $this->createNotFoundException(
                    'No product found for id '
            );
        }

        $karte->setPGuID('New product name!');
        $em->flush();
    }

}

如果我做了

exit(\Doctrine\Common\Util\Debug::dump($karte));

它返回此

array(1) {
  [0]=>
  object(stdClass)#497 (9) {
    ["__CLASS__"]=>
    string(30) "CQ\IntranetBundle\Entity\Karte"
    ["pGuId"]=>
    string(36) "00f8e77c-d8c2-4c7f-8e4a-384cc7689da0"
    ["PBarcode"]=>
    string(13) "3321231140001"
    ["PAnreise"]=>
    string(8) "DateTime"
    ["PAbreise"]=>
    string(8) "DateTime"
    ["PMGuId"]=>
    string(36) "07b7c4cf-3441-4339-9b3c-1a581e1271ba"
    ["PDateCreate"]=>
    string(8) "DateTime"
    ["PDateModify"]=>
    string(8) "DateTime"
    ["PDateAccess"]=>
    string(8) "DateTime"
  }
}

2 个答案:

答案 0 :(得分:2)

根据文件:

http://symfony.com/doc/current/book/doctrine.html

您正在使用一个返回数组的方法,无论它返回多少结果。

在您的示例中,它可能会返回1个结果,因为您使用的密钥是唯一的。

在这种情况下,您可以使用:

$karte = $em->getRepository('CQIntranetBundle:Karte')->findByPGuId('00f8e77c-d8c2-4c7f-8e4a-384cc7689da0')[0];

将直接将$karte指向第一个(也是唯一的)对象到数组中。

通过使用仅返回一个结果的方法将获得相同的结果,因为前一个回答者指向findOneBy...()

答案 1 :(得分:0)

$karte是一个数组,如果要在数组的每个元素上设置属性,则必须使用循环。

或者,如果您只想获得一个Karte,则应使用findOneBy代替findBy .....