Как получить доступ к свойствам узла через 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.