我使用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,则会返回数据,但从架构的角度来看,这没有意义 - 模板不会使用'一篇文章。
那么我错过了什么?
答案 0 :(得分:0)
更有趣的是,如果我在两个方向上建立了相同的关系,它会返回值。
这是正确的,因为这是它的运作方式。值得了解的是,您定义的关系方法代表了关系本身,这意味着两个模型Template
和Article
都可以从任何一方定位USED_BY
关系,它必须是相同的在articles()
和template
。
解决方案是在双方使用USES
(或任何你喜欢的概念)之类的东西。 This reference应该帮助您就自己的人际关系做出正确的决定。
另一方面,如果你仍然希望双方有不同的关系,那么请注意,在你的模型(图像)中,两个关系都处于传出方向。 即。 Fibble-[:USES]->Template
和Template-[:USED_BY]->Fibble
,这意味着template()
应该是传出关系,例如hasOne
而不是传入的belongsTo
。