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)

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

《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
讨论数量: 6

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

2年前 评论
黑将军

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

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

分两次去查吧!

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

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);

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

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

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

2年前 评论

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