Laravel 5 雄辩的嵌套关系返回null。创建错误查询
下午好 我已经尽了最大的努力来解决这个问题,阅读了所有关于这个问题的线索,但我仍然没有解决我的问题的运气。 如果有人能帮助我,我将非常感激 背景 我在Ubuntu 14.04的Homestead环境中使用了Laravel5.2 数据库 我有3个表:条目、注释、作者。所有PK均命名为“id” 这是一张照片 相关迁移详细信息(注释表迁移): 模型: 进入模式:Laravel 5 雄辩的嵌套关系返回null。创建错误查询,laravel-5,eloquent,Laravel 5,Eloquent,下午好 我已经尽了最大的努力来解决这个问题,阅读了所有关于这个问题的线索,但我仍然没有解决我的问题的运气。 如果有人能帮助我,我将非常感激 背景 我在Ubuntu 14.04的Homestead环境中使用了Laravel5.2 数据库 我有3个表:条目、注释、作者。所有PK均命名为“id” 这是一张照片 相关迁移详细信息(注释表迁移): 模型: 进入模式: public function comments() { return $this->hasMany('App\Models\
public function comments() {
return $this->hasMany('App\Models\Comment');
}
作者模型:
public function comments() {
return $this->hasMany('App\Models\Comment');
}
注释模型:
public function entry() {
return $this->belongsTo('App\Models\Entry');
}
public function author() {
return $this->belongsTo('App\Models\Author', 'id');
}
控制器:(嵌套关系查询)
此时,一切都正常工作,因此上述$entries包含由以下内容组成的预期集合:
*嵌套在每个实体中的所有实体:
**所有关联的注释,并嵌套在该注释中
***每个评论的关联作者
问题
当我在数据库中有多个注释包含相同的author_id值时,就会出现问题。
在这个场景中,laravel集合为我提供了第一个实例的预期数据(具有嵌套作者的有效嵌套注释集合),
但是包含相同author_id的任何后续实例在relations属性中的值为null,这将导致以下错误:
1/2 ErrorException in 991fecee1bbd0eb1ec5070d2f47d9c641ca4a735.php line 24:
Trying to get property of non-object
只有当多个作者id相同时,我才会出现上述错误。
因此,我知道在视图中访问集合数据的方式没有问题
调试由以下人员创建的查询:
工作查询:(当数据库中的所有注释都有唯一的作者id时)例如:
有问题的查询:(当数据库中有一条评论与另一条评论共享作者id时)例如:
我认为问题在于第三个查询包含:“in('1','2'),其中2不存在
有没有人想过如何解决这个问题?
我真的很想能够成功地利用拉威尔内置的雄辩的嵌套关系系统。
但如果这不可行,我需要编写自己的自定义查询吗?
任何输入都将是美妙的!我真的被这件事缠住了
谢谢你的时间和帮助。谢谢@Ravisha Hesh 问题是由以下原因引起的:
public function author() {
return $this->belongsTo('App\Models\Author', 'id');
}
解决方案:
public function author() {
return $this->belongsTo('App\Models\Author', 'author_id');
}
从
author
关系中删除id
,或将其更改为author\u id
谢谢@Ravisha Hesh,使用“id”的注释模型关系确实是问题的原因。我把“id”改为“author\u id”,现在它工作得很好。
| id | author_id | text |
|---- |----------- |------- |
| 1 | 1 | blah1 |
| | | |
select * from `entries`
select * from `comments` where `comments`.`entry_id` in ('1')
select * from `authors` where `authors`.`id` in ('1')
#relations: array:1 [▼
"author" => Author {
//all correct data displays here
| id | author_id | text |
|---- |----------- |------- |
| 1 | 1 | blah1 |
| 2 | 1 | blah2 |
| | | |
select * from `entries`
select * from `comments` where `comments`.`entry_id` in ('1', '2')
select * from `authors` where `authors`.`id` in ('1', '2')
#relations: array:1 [▼
"author" => null
]
public function author() {
return $this->belongsTo('App\Models\Author', 'id');
}
public function author() {
return $this->belongsTo('App\Models\Author', 'author_id');
}