Laravel 远程一对多关系,中间表模型和关联模型不能是同一个模型

表结构如下:
用户- users: id,
回复- replies: id, user_id, parent_id,
parent_id 是这条回复所回复的回复对象的id。
user_id 是这条回复的用户id。

现在想取得id为1的用户所有给他的回复所有回复。这样就构成了远程一对多的关系。

User中:

 public function receivedReplies()
    {
        return $this->hasManyThrough(Reply::class, Reply::class, 'user_id', 'parent_id');
    }

远程一对多的关系定义没有问题。但是,远程一对多中中间表和关联表一样,生成sql语句中的jion没有重命名表,导致两个同表名冲突。报的错误如下:

SQLSTATE[42000]: Syntax error or access violation: 1066 Not unique table/alias: 'replies' (SQL: select count(*) as aggregate from `replies` inner join `replies` on `replies`.`id` = `replies`.`parent_id` where `replies`.`user_id` = 1 and `user_id` <> 1)

请问这种问题有好的解决办法吗?

《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 6

这问题无解,有人在github 提这个问题。最后还是自己构造sql。

1年前 评论
黑将军

我也碰到没有重命名表的问题,无解

1年前 评论
yanyin (楼主) 1年前

分两次去查吧!

一个用户有多条回复,一条回复又有多条回复!

User:

public function replies(){
    return $this->hasMany(Reply::class);
}

Reply:

public function replies(){
    return $this->hasMany(Reply::class, 'parent_id');
}

Controller:

User::with(['replies'=>function($query){
    $query->with(['replies']);
}])->find(1);

大概思路,我没具体试过!!

1年前 评论
yanyin (楼主) 1年前

重新构造表吧, 一级回复用comments 二级回复用replies. 你这个属于可以无限嵌套的模式, 比如user1回复的回复的回复, 算不算给user1的呢?

1年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!