Как получить доступ к свойствам узла через 2 отношения с NEO4J-PHP-OGM

Я не могу понять, как получить доступ к свойствам через 2 отношения с библиотекой neo4j-php-ogm.

Скажем, например, у меня есть "пользовательский" узел, который подключается к МНОГИМ "ресурсным" узлам, каждый из которых, в свою очередь, связан с фиксированным числом предопределенного "MetaResource" узла. Узлы "ресурса" имеют свойства, а узлы "MetaResource" имеют мета-свойства каждого типа ресурса. Как я могу получить доступ к свойствам узлов "MetaResource", начиная с узла "пользователь"? В Neo4j один такой маршрут выглядит так:

(user)-[r:HAS_RESOURCE]->(resource)-[m:METARESOURCE]->(metaResource)

Мой пример сущности пользователя:

/**
 * @OGM\Node(label="User")
 */

class User
{
    /**
     * @OGM\GraphId()
     * @var int
     */
    private $id;

    /**
     * @OGM\Relationship(type="HAS_RESOURCE", direction="OUTGOING", targetEntity="\AppBundle\Entity\Resources", collection=true)
     * @var ArrayCollection|\AppBundle\Entity\Resources[]
     */
    protected $resources;

    /**
     * @return \Doctrine\Common\Collections\ArrayCollection|\AppBundle\Entity\Resources[]
     */
    public function getResources()
    {        
        return $this->resources;
    }

    /**
     * @return \Doctrine\Common\Collections\ArrayCollection|\AppBundle\Entity\Resources[]
     */
    public function getResource($name)
    {

        foreach($this->resources as $resource){
            if($resource->getResourceType() == $name){
                return $resource;
                break;
            }
        }        
    }


    /**
     * @param AppBundle\Entity\Resources $resources
     */
    public function addResource(Resources $resources)
    {
        if (!$this->resources->contains($resources)) {
            $this->resources->add($resources);
        }
    }
}

Мой пример ресурсной сущности:

/**
 * @OGM\Node(label="Resources")
 */

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

    /**
     * @OGM\Property(type="int")
     * @var int
     */

    protected $resourcecount;    


   /**
    * @OGM\Relationship(type="METARESOURCE", direction="OUTGOING", targetEntity="\AppBundle\Entity\MetaResource", collection=false)
    * @var MetaResource
    */

    protected $metaResource;

    /**
     * @param \AppBundle\Entity\MetaResource $metaResource
     */

    public function __construct(MetaResource $metaResource)
    {
        $this->metaResource = $metaResource;
    }    

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

    public function getResourceCount()
    {
        return $this->resourcecount;
    }

    public function setResourceCount($resourcecount)
    {
        $this->resourcecount = $resourcecount;
    }

    /**
     * @return \AppBundle\Entity\MetaResource
     */

    public function getMetaResource()
    {        
        return $this->metaResource;
    }


}

И мой пример объекта MetaResource:

/**
 * @OGM\Node(label="MetaResource")
 */

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

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

    protected $resourceType;

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

    protected $name_DE;    

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

    protected $icon;

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

    protected $iconColour;

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

    protected $colour;  

    public function getResourceType()
    {
        return $this->resourceType;
    }


    public function getName_DE()
    {
        return $this->name_DE;
    }


    public function getIcon()
    {
        return $this->icon;
    }


    public function getIconColour()
    {
        return $this->iconColour;
    }

    public function getColour()
    {
        return $this->colour;
    }

}

И, наконец, код из моего контроллера, который устанавливает отношения:

$metaResource=$em->getRepository(MetaResource::class)->findOneBy('resourceType', 'wood');  
$rWood = new Resources($metaResource);            
$rWood->setResourceCount(20);
$em->persist($rWood);
$em->flush();
$user->addResource($rWood);

Если я сейчас взгляну на веб-консоль Neo4j, все отношения и узлы будут правильно вставлены.

Теперь, если я получу ресурсы пользователя с $user->getResources() Я успешно получил все объекты ресурсов, но свойство "$metaResource" всегда равно NULL вместо ожидаемого объекта моей сущности MetaResource. Например, если я делаю:

foreach($user->getResources() as $resource){
    var_dump($resource->getMetaResource());        
}

Тогда он выводит только NULL.

С другой стороны, если я непосредственно получаю объект ресурса (например, с $resource = $em->getRepository(Resources::class)->findOneById(123)), а затем попробуйте получить подключенный MetaResource с $resource->getMetaResource() оно работает. Что мне не хватает?

ура

1 ответ

Я добился определенного прогресса в этом случае использования. Сейчас я использую прокси-генератор, который может обработать этот вариант использования (на самом деле это была большая недостающая часть в библиотеке, но для ее реализации требуется время).

Поэтому, пожалуйста, протестируйте последнюю версию 1.0.0-бета7.

Другие вопросы по тегам