简体   繁体   English

PHP neo4j OGM-检测到递归

[英]PHP neo4j OGM - Recursion detected

i'm using the entitymanager in my project. 我在我的项目中使用了entitymanager。 I can successfuly read/add my entites and relations between them to the db but have one problem. 我可以成功读取/添加我的实体和它们之间的关系到数据库,但是有一个问题。

I have two nodes Employee and Document and a relationship between them as Employee HAS Document. 我有两个节点Employee和Document,它们之间的关系作为Employee HAS Document。

php class for 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 class for Document: 用于文档的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()
        ];
    }
}

then i have two API endpoints i use the Slim framework for the REST API basically i have two methods that return the data. 然后我有两个API端点,我为REST API使用了Slim框架,基本上我有两个返回数据的方法。

for Employees: 对于员工:

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


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

    return $employees;
}

for Documents: 对于文件:

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

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

    return $documents;
}

So my problem is when i uncomment then line 所以我的问题是当我取消注释然后行

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

in the Document class 在文档类中

i get a Runtime error Recursion detected 我收到检测到的运行时错误递归

without that line everything works fine. 没有那条线,一切正常。

Can somebody help me what am i missing? 有人可以帮助我我所缺少的吗?

The error happens because in jsonSerialize() of Documents you include all Employees. 发生错误是因为在jsonSerialize()中您包括了所有Employees。 In jsonSerialize() of Employee you include all Documents so you create an endless nesting of documents which does never end. jsonSerialize() ,您包括所有文档,因此您创建了jsonSerialize()无休止的文档嵌套。 When including Documents inside of an Employee record in the API response you should skip serializing all Documents. 在API响应中将文档包含在Employee记录内时,您应该跳过序列化所有文档。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM