2017-07-28 54 views
0

我在我的項目中使用了entitymanager。我可以成功讀取/添加我的實體和他們之間的關係到數據庫,但有一個問題。PHP neo4j OGM - 檢測到遞歸

我有兩個節點Employee和Document以及它們之間的關係爲Employee HAS Document。

PHP類Emloyee:

<?php 
namespace App\Models; 

use GraphAware\Neo4j\OGM\Annotations as OGM; 
use \GraphAware\Neo4j\OGM\Common\Collection; 

/** 
* 
* @OGM\Node(label="Employee") 
*/ 
class Employee implements \JsonSerializable { 

    public function __construct() { 
     $this->documents = new Collection(); 
     $this->addresses = new Collection(); 
    } 

    /** 
    * Id 
    * @var int 
    * @OGM\GraphId() 
    */ 
    protected $id; 

    /** 
    * name 
    * @var string 
    * 
    * @OGM\Property(type="string") 
    */ 
    protected $name; 

    /** 
    * lastname 
    * @var string 
    * 
    * @OGM\Property(type="string") 
    */ 
    protected $lastname; 

    /** 
    * personalidnumber 
    * @var string 
    * 
    * @OGM\Property(type="string") 
    */ 
    protected $personalidnumber;  

    /** 
    * @var Document[]|Collection 
    * 
    * @OGM\Relationship(type="HAS", direction="OUTGOING", collection=true, mappedBy="employees", targetEntity="Document") 
    */  
    protected $documents; 


    /** 
    * @var Address[]|Collection 
    * 
    * @OGM\Relationship(type="HAS", direction="OUTGOING", collection=true, mappedBy="employees", targetEntity="Address") 
    */  
    protected $addresses; 

    public function getaddresses() { 
     return $this->addresses; 
    } 

    public function getdocuments(){ 
     return $this->documents; 
    }  

    public function getname(){ 
     return $this->name; 
    } 

    public function setname($name){ 
     $this->name = $name; 
    } 

    function getlastname() { 
     return $this->lastname; 
    } 
    public function setlastname($lastname){ 
     $this->lastname = $lastname; 
    } 

    function getpersonalidnumber() { 
     return $this->lastname; 
    } 
    public function setpersonalidnumber($personalidnumber){ 
     $this->personalidnumber = $personalidnumber; 
    } 



    public function jsonSerialize() { 
     return [ 
      'id' => $this->id, 
      'name' => $this->name, 
      'lastName' => $this->lastname, 
      'personalidnumber' => $this->personalidnumber, 
      'addresses' =>$this->addresses->toArray(), 
      'documents' =>$this->documents->toArray() 
     ]; 
    } 
} 

PHP類文件:

<?php 

namespace App\Models; 

use GraphAware\Neo4j\OGM\Annotations as OGM; 
use GraphAware\Neo4j\OGM\Common\Collection; 

/** 
* 
* @OGM\Node(label="Document") 
*/ 
class Document implements \JsonSerializable{ 

    public function __construct() { 
     $this->employees = new Collection(); 

     $timezone = new \DateTimeZone('Europe/Ljubljana'); 
     $t = microtime(true); 
     $micro = sprintf("%06d",($t - floor($t)) * 1000000); 
     $dt = new \DateTime(date('Y-m-d H:i:s.'.$micro, $t)); 
     $dt->setTimezone($timezone); 
     $this->crdate = $dt->format('YmdHis.u'); 
     $this->validfrom = $this->crdate; 
    } 

    /** 
    * @OGM\GraphId() 
    * 
    * @var int 
    */ 
    protected $id; 

    /** 
    * @var string 
    * 
    * @OGM\Property(type="string") 
    */ 
    protected $name; 

    /** 
    * @var string 
    * 
    * @OGM\Property(type="string") 
    */ 
    protected $uniquename; 

    /** 
    * @var string 
    * 
    * @OGM\Property(type="string") 
    */ 
    protected $path; 


    /** 
    * @var string 
    * 
    * @OGM\Property(type="string") 
    */ 
    protected $ext; 

    /** 
    * @var string 
    * 
    * @OGM\Property(type="string") 
    */ 
    protected $documentid; 

    /** 
    * @var string 
    * 
    * @OGM\Property(type="string") 
    */ 
    protected $validfrom; 

    /** 
    * @var string 
    * 
    * @OGM\Property(type="string") 
    */ 
    protected $validto; 

    /** 
    * @var string 
    * 
    * @OGM\Property(type="string") 
    */ 
    protected $crdate; 

    /** 
    * @var string 
    * 
    * @OGM\Property(type="string") 
    */ 
    protected $language;  


    /** 
    * @var string 
    * 
    * @OGM\Property(type="string") 
    */ 
    protected $type;  

    /** 
    * @var string 
    * 
    * @OGM\Property(type="string") 
    */ 
    protected $description;  

    /** 
    * @var DocEmployees[]|Collection 
    * 
    * @OGM\Relationship(type="HAS", direction="INCOMING", collection=true, mappedBy="documents", targetEntity="Employee") 
    */ 
    protected $employees; 


    public function getemployees() { 
     return $this->employees; 
    } 

    public function getid() { 
     return $this->id; 
    } 

    public function getname() { 
     return $this->name; 
    } 
    public function setname($name) { 
     $this->name = $name; 
    } 

    public function getuniquename() { 
     return $this->uniquename; 
    } 
    public function setuniquename($uniquename) { 
     $this->uniquename = $uniquename; 
    } 

    public function getpath() { 
     return $this->path; 
    } 
    public function setpath($path) { 
     $this->path = $path; 
    } 

    public function getext() { 
     return $this->ext; 
    } 
    public function setext($ext) { 
     $this->ext = $ext; 
    } 

    public function getdocumentid() { 
     return $this->documentid; 
    } 
    public function setdocumentid($documentid) { 
     $this->documentid = $documentid; 
    }  

    public function getvalidfrom() { 
     return $this->validfrom; 
    } 

    public function setvalidfrom($validfrom) { 
     $this->validfrom = $validfrom; 
    } 

    public function getvalidto() { 
     return $this->validto; 
    } 

    public function setvalidto($validto) { 
     $this->validto = $validto; 
    }  

    public function getlanguage() { 
     return $this->language; 
    } 
    public function setlanguage($language) { 
     $this->language = $language; 
    } 

    public function getcrdate() { 
     return $this->crdate; 
    } 
    public function setcrdate($crdate) { 
     $this->crdate = $crdate; 
    } 

    public function gettype() { 
     return $this->type; 
    } 
    public function settype($type) { 
     $this->type = $type; 
    } 

    public function getdescription() { 
     return $this->description; 
    } 
    public function setdescription($description) { 
     $this->description = $description; 
    } 

    public function getfullname(){ 
     return $this->path.$this->uniquename; 
    } 

    public function jsonSerialize() { 
     return [ 
      'id' => $this->id, 
      'name' => $this->name, 
      'uniquename' => $this->uniquename, 
      'path' => $this->path, 
      'ext' => $this->ext, 
      'validfrom' => $this->validfrom, 
      'validto' => $this->validto, 
      'language' => $this->language, 
      'crdate' => $this->crdate, 
      'type' => $this->type, 
      'description' => $this->description, 
      'employees' => $this->employees->toArray() 
     ]; 
    } 
} 

然後我有兩個API端點我使用超薄框架的REST API 基本上我有兩個方法返回數據。

爲員工:

public function getAllEmployees(){ 
    $this->logger->info(__CLASS__.':'.__FUNCTION__); 


    $employeesRepository = $this->dbentity->getRepository(Employee::class); 
    $employees = $employeesRepository->findAll(); 

    return $employees; 
} 

的文件:

public function getAllDocuments(){ 
    $this->logger->info(__CLASS__.':'.__METHOD__); 

    $documentRepository = $this->dbentity->getRepository(Document::class); 
    $documents = $documentRepository->findAll(); 

    return $documents; 
} 

所以我的問題是,當我在文檔類

我得到那麼線

  'employees' => $this->employees->toArray() 

取消註釋一個Runtime error遞歸檢測

沒有該行一切正常。

有人可以幫助我什麼我錯過了嗎?

回答

0

發生此錯誤的原因在於您包含所有員工的文檔的jsonSerialize()。在Employee的jsonSerialize()中,您包含所有文檔,因此您可以創建永無止境的文檔嵌套。 在API響應中的員工記錄中包含文檔時,應該跳過序列化所有文檔。