0

我正在使用 NeoEloquent 修补 Neo4j 2.3.0 和 Laravel 5.1。我已经设置了几个虚拟节点以及它们之间的一些关系:

Neo4j 模型的图像 - 抱歉,我还不能直接插入图像 :)

所以文章可以使用模板。_ 这种关系的反面是文章使用模板

我已经设置了这样的类:

Class Template extends Model
{
    public function articles()
    {
        return $this->hasMany('App\Article', 'USED_BY');
    }
}

和:

Class Article extends Model
{
    public function template()
    {
        return $this->belongsTo('App\Template', 'USES');
    }
}

到目前为止,一切都很好,我想。

我有一个页面,我希望最终列出系统中的所有文章,以及一些有用的元数据,比如每个人使用的模板。为此,我在控制器中设置了一些东西:

$articles = array();

foreach (Article::with('template')->get() as $article) {
    array_push($articles, $article);
}

return $articles;

不是最优雅的,但它应该返回文章及其关联模板的数据。然而:

[{"content":"Some test content","title":"Test Article","id":28,"template":null},{"content":"Some flibble content","title":"Flibble","id":31,"template":null}]

所以问题是 - 为什么返回 null?

更有趣的是,如果我在两个方向上设置与同一事物的关系,它会返回值。即,如果我将USED_BY 更改为USES,则返回数据,但这从架构的角度来看没有意义——模板不会“使用”文章。

那么我错过了什么?

4

1 回答 1

0

更有趣的是,如果我在两个方向上设置与同一事物的关系,它会返回值。

这是正确的,因为这就是它的运作方式。值得知道的是,您定义的关系方法代表关系本身,这意味着对于两个模型Template以及从任何一方Article定位USED_BY关系,它必须在articles()和中相同template

解决方案是USES在双方都使用类似(或您喜欢的任何概念)的东西。该参考资料应该可以帮助您就您的人际关系做出正确的决定。

另一方面,如果您仍然希望两侧有不同的关系,请注意在您的模型(图像)中,两种关系都是向外的方向。ieFibble-[:USES]->TemplateTemplate-[:USED_BY]->Fibblewhich 意味着template()应该是一个传出的关系,hasOne而不是belongsTo哪个是传入的。

于 2015-11-10T08:01:57.053 回答