Reputation: 13
i'm using the entitymanager in my project. 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.
php class for 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 class for Document:
<?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.
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?
Upvotes: 0
Views: 124
Reputation: 3819
The error happens because in jsonSerialize()
of Documents you include all Employees. In jsonSerialize()
of Employee you include all Documents so you create an endless nesting of documents which does never end.
When including Documents inside of an Employee record in the API response you should skip serializing all Documents.
Upvotes: 0