与NeoEloquent的关系映射

时间:2015-11-09 22:17:35

标签: laravel neo4j eloquent laravel-5.1 neoeloquent

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

image of Neo4j model - apologies, I cannot insert images directly yet :)

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

我已经设置了这样的类:

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,则会返回数据,但从架构的角度来看,这没有意义 - 模板不会使用'一篇文章。

那么我错过了什么?

1 个答案:

答案 0 :(得分:0)

  

更有趣的是,如果我在两个方向上建立了相同的关系,它会返回值。

这是正确的,因为这是它的运作方式。值得了解的是,您定义的关系方法代表了关系本身,这意味着两个模型TemplateArticle都可以从任何一方定位USED_BY关系,它必须是相同的在articles()template

解决方案是在双方使用USES(或任何你喜欢的概念)之类的东西。 This reference应该帮助您就自己的人际关系做出正确的决定。

另一方面,如果你仍然希望双方有不同的关系,那么请注意,在你的模型(图像)中,两个关系都处于传出方向。 即。 Fibble-[:USES]->TemplateTemplate-[:USED_BY]->Fibble ,这意味着template()应该是传出关系,例如hasOne而不是传入的belongsTo