虽然我们能够创建新节点等,但我们仍在努力找出如何将属性添加到现有关系中。例如,我们以实体格式声明以下内容:
/**
* @OGM\ManyToMany(relation="GOES_TO_MARKET")
*/
protected $shoppers;
我们如何做到这一点,以便我们可以使用教义格式向 GOES_TO_MARKET 添加其他属性?
谢谢
目前没有直接的方法可以通过 API 来完成。虽然有一些工作正在进行中,但距离完成还很远。
您可以在创建关系时注册回调。
$em->registerEvent(HireVoice\Neo4j\EntityManager::RELATION_CREATE, function ($type, $relationName, $from, $to, $relation) {
// $relation is the Everyman\Neo4j\Relationship
if ($relationName === 'GOES_TO_MARKET') {
$relation->setProperty('foobar', 'baz')->save();
}
});
注意到 Louis-Philippe 发布的解决方案在最近安装后无法正常工作,因为 EntityManager 类下的 triggerEvent 方法正在对提供的参数调用 array_shift。因此,这导致回调仅接收五个必需参数中的四个。
$em->registerEvent(HireVoice\Neo4j\EntityManager::RELATION_CREATE, function ($type, $relationName, $from, $to, $relation) {
// $relation is the Everyman\Neo4j\Relationship
if ($relationName === 'GOES_TO_MARKET') {
$relation->setProperty('foobar', 'baz')->save();
}
});
通过替换以下内容已解决此问题:(请注意,这尚未经过彻底测试,可能会影响代码的其他部分。)
private function triggerEvent($eventName, $data)
{
if (isset($this->eventHandlers[$eventName])) {
$args = func_get_args();
array_shift($args);
foreach ($this->eventHandlers[$eventName] as $callback) {
$clone = $args;
call_user_func_array($callback, $clone);
}
}
}
经过:
private function triggerEvent($eventName, $data)
{
if (isset($this->eventHandlers[$eventName])) {
$args = func_get_args();
foreach ($this->eventHandlers[$eventName] as $callback) {
$clone = $args;
call_user_func_array($callback, $clone);
}
}
}