【问题标题】:PHP neo4j OGM - Recursion detectedPHP neo4j OGM - 检测到递归
【发布时间】:2017-07-28 07:30:21
【问题描述】:

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

我有两个节点 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()

在文档类中

我得到一个Runtime error 检测到递归

没有这条线一切正常。

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

【问题讨论】:

    标签: php recursion neo4j graphaware neo4j-php-ogm


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多