雄辩的嵌套关系返回null。创建错误的查询

时间:2016-05-20 17:42:37

标签: laravel-5 eloquent

下午好,

我已经尽力解决这个问题,通过我在这个问题上找到的所有线程阅读,但我仍然没有运气来解决我的问题。 如果有人能帮助我,我会非常感激!

背景

我在Ubuntu 14.04的Homestead环境中使用Laravel 5.2。

数据库

我有3个表:条目,评论,作者。所有PK都被命名为' id'

以下是Database Schema的图片。

Relevent Migration Details(注释表迁移):
$table->integer('entry_id')->unsigned();
$table->foreign('entry_id')->references('id')->on('entries')->onDelete('cascade');
$table->integer('author_id')->unsigned();
$table->foreign('author_id')->references('id')->on('authors');

模型:

参赛模型:

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 = Entry::with('comments.author')->get();

此时一切正常,因此上述$条目包含由以下内容组成的预期集合:

*所有的内容,嵌套在每个内容中:

**所有相关评论,并嵌套在

***每个评论的相关作者。

问题

当我在DB中有多个包含相同author_id值的注释时,会出现问题。 在这种情况下,laravel Collection为我提供了第一个实例的预期数据(一个有嵌套作者的有效嵌套注释集合), 但是任何包含相同author_id的后续实例在relations属性中的值都为null,这会导致以下错误:

1/2 ErrorException in 991fecee1bbd0eb1ec5070d2f47d9c641ca4a735.php line 24:
Trying to get property of non-object

当多个author_id相同时,我只会收到上述错误。 因此,我知道在视图中访问集合数据的方式没有问题。

调试由eloquent创建的查询:

工作查询:(当DB中的所有注释都有唯一的author_id时)EG:
| 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
有问题的查询:(当DB中有一条评论与另一条评论共享一个author_id时)EG:
| 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
]

我认为问题在于第三个查询包含:" in(' 1',' 2')"其中2不存在。

有没有人对如何解决这个问题有什么想法? 我真的希望能够成功地利用Laravel建立的雄辩的嵌套关系系统。 但如果这不可行,我是否需要写自己的自定义查询? 任何输入都会很精彩!我真的坚持这个。

感谢您的时间和帮助。

1 个答案:

答案 0 :(得分:1)

感谢@Ravisha Hesh。

问题是由以下原因造成的:

public function author() {
    return $this->belongsTo('App\Models\Author', 'id');
}

解决方案:

public function author() {
    return $this->belongsTo('App\Models\Author', 'author_id');
}