neo4j-php-ogm ライブラリとの 2 つの関係を介してプロパティにアクセスする方法がわかりません。
たとえば、多数の「リソース」ノードに接続する「ユーザー」ノードがあり、各ノードは固定数の事前定義された「 MetaResource」ノードに接続されているとします。「リソース」ノードにはプロパティがあり、「MetaResource」ノードには各リソース タイプのメタ プロパティがあります。「user」ノードから始まる「MetaResource」ノードのプロパティへのアクセスを知るにはどうすればよいですか? Neo4j では、そのようなルートの 1 つが次のようになります。
(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 Web コンソールを見ると、すべての関係とノードが正しく挿入されています。
ここで、ユーザーのリソースを取得すると、$user->getResources()
すべてのリソース オブジェクトを正常に取得できますが、MetaResource エンティティの予想されるオブジェクトではなく、「$metaResource」プロパティが常に NULL になります。たとえば、次のようにします。
foreach($user->getResources() as $resource){
var_dump($resource->getMetaResource());
}
次に、NULL のみを出力します。
一方、リソース オブジェクトを (たとえば で$resource = $em->getRepository(Resources::class)->findOneById(123)
) 直接取得してから、接続された MetaResource を取得しようとすると、機能し$resource->getMetaResource()
ます。私は何が欠けていますか?
乾杯