2016-01-26 65 views
0

嘿,我有這個我無法克服的有線錯誤。我正在使用Symfony Framweork和Doctrine進行數據庫交互。我正在嘗試開發一個簡單的CRUD API來掌握一些概念。Symfony,Doctrine更新不能按預期工作

實際的問題是,當我嘗試更新我的DB的項目,如果該項目的ID是DB裏面只能否則我得到這個錯誤:

Error: Call to a member function setTitle() on a non-object 

看一看我的倉庫:

<?php 

namespace BooksApi\BookBundle\Repositories; 

use Doctrine\ORM\EntityManager; 
use Doctrine\ORM\Query\QueryException; 

class UpdateBookRepository 
{ 
    /** 
    * @var EntityManager 
    */ 
    public $em; 

    /** 
    * @param EntityManager $entityManager 
    */ 
    public function __construct(
     EntityManager $entityManager 
    ){ 
     $this->em = $entityManager; 
    } 

    public function updateBook($id, $update) 
    { 
     try { 
      $book = $this->em->getRepository('BooksApiBookBundle:BooksEntity') 
       ->find($id); 

      $book->setTitle($update); 
      $this->em->flush(); 
     } catch (\Exception $em) { 
      throw new QueryException('003', 502); 
     } 

     return $book; 
    } 
} 

而且我廠:

<?php 

namespace BooksApi\BookBundle\Repositories; 

use Doctrine\ORM\EntityManager; 
use Doctrine\ORM\Query\QueryException; 

class UpdateBookRepository 
{ 
    /** 
    * @var EntityManager 
    */ 
    public $em; 

    /** 
    * @param EntityManager $entityManager 
    */ 
    public function __construct(
     EntityManager $entityManager 
    ){ 
     $this->em = $entityManager; 
    } 

    public function updateBook($id, $update) 
    { 

     $book = $this->em->getRepository('BooksApiBookBundle:BooksEntity') 
      ->find($id); 

     if ($book) 
     { 
      try { 
       $book->setTitle($update); 
       $this->em->flush(); 
      } catch (\Exception $em) { 
       throw new QueryException('003', 502); 
      } 

      return $book; 
     } else { 
      return false; 
     } 
    } 
} 

工廠處理響應真或假,所以我n事件,我會嘗試更新一個項目這是ID不在數據庫工廠應迴應false, 'Unable to Update Book'而不是我得到上述錯誤,任何想法爲什麼傢伙..?

+1

顯然,$ book對象爲null。你有沒有檢查你是否有db中的記錄? –

+0

對象被更新,如果它存在於數據庫中,否則我會得到上面的錯誤。但是如果你看看我的工廠,我爲它做了一個例子....所以,而不是看到我期望看到{flase,無法更新書}響應的錯誤消息。 – John

+0

原因是你不檢查'find()'返回的是什麼(如果這本書不存在,它是'null')。 – xabbuh

回答

0

確保$ book對象在繼續執行代碼之前不是空的。該錯誤表明$ book是空/空的。 另外,堅持您的對象之前使用齊平

$this->em->persist($book); 
$this->em->flush(); 
1

@Tomazi,你可以通過在調用「setTitle」方法之前檢查對象是否存在來避免錯誤。

public function updateBook($id, $update) 
{ 
    $book = $this->em->getRepository('BooksApiBookBundle:BooksEntity')->find($id); 

    if ($book) { 
     $book->setTitle($update); 
     $this->em->flush(); 

     return $book; 
    } 

    return null; 
} 
+0

Unfortanilly你的方式沒有工作,但它減輕了我,改變了你的建議有點現在的作品感謝彎曲的道路。 – John