1

虽然我们能够创建新节点等,但我们仍在努力找出如何将属性添加到现有关系中。例如,我们以实体格式声明以下内容:

   /**
     * @OGM\ManyToMany(relation="GOES_TO_MARKET")
     */
    protected $shoppers;

我们如何做到这一点,以便我们可以使用教义格式向 GOES_TO_MARKET 添加其他属性?

谢谢

4

2 回答 2

2

目前没有直接的方法可以通过 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();
    }
});
于 2013-06-28T12:56:09.257 回答
1

注意到 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);
        }
    }
}
于 2014-04-01T14:20:28.370 回答