0

我在我的项目中使用实体管理器。我可以成功地将我的实体和它们之间的关系读取/添加到数据库,但有一个问题。

我有两个节点 Employee 和 Document,它们之间的关系是 Employee HAS Document。

Emloyee 的 php 类:

<?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 的 Slim 框架基本上我有两种返回数据的方法。

对于员工:

    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()

在文档类中

我得到一个运行时错误检测到递归

没有那条线一切正常。

有人可以帮我我错过了什么吗?

4

1 回答 1

0

发生错误是因为在jsonSerialize()文档中包含所有员工。在jsonSerialize()Employee 中,您包含所有文档,因此您可以创建无休止的文档嵌套,永远不会结束。在 API 响应中的员工记录中包含文档时,您应该跳过序列化所有文档。

于 2017-11-12T22:22:54.730 回答