想请问一个关于Eloquent多表关联的一个问题

目前有以下表:
表A有:id,book_id
表B有:book_id,zuozhe_id
表C有:book_id,fanyi_id
表D有:zuozhe_id,zuozhe_name
表E有:fanyi_id,fanyi_name

其实B表和C表就是中间表那种概念。

因为一本书有多个作者,同时,一本书也有多个人参与翻译。想通过A表的book_id获取到该本书的所有zuozhe_name以及fanyi_name,以下是我弄的,虽然没有报错,但是没有出数据。想请教一下,问题出在哪了?

A model

    public function bTable()
    {
        return $this->hasMany(BModel::class, 'book_id', 'book_id');
    }

    public function cTable()
    {
        return $this->hasMany(CModel::class, 'book_id', 'book_id');
    }

B model

    public function aTable()
    {
        return $this->belongsTo(AModel::class, 'book_id', 'book_id');
    }

    public function dTable()
    {
        return $this->belongsTo(DModel::class, 'zuozhe_id', 'zuozhe_id');
    }

C model

    public function aTable()
    {
        return $this->belongsTo(AModel::class, 'book_id' ,'book_id');
    }

    public function eTable()
    {
        return $this->belongsTo(DModel::class, 'fanyi_id', 'fanyi_id');
    }

D model

    public function bTable()
    {
        return $this->hasMany(BModel::class, 'narrator_id', 'narrator_id');
    }

E model

    public function cTable()
    {
        return $this->hasMany(BModel::class, 'fanyi_id', 'fanyi_id');
    }

控制器的内容

       $builder = AModel::with('bTable.dTable','cTable.eTable');

        return Grid::make($builder, function (Grid $grid) {
            $grid->column('zuozhe_name');
            $grid->column('fanyi_name');
        }

非常感谢回答

《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
最佳答案

@LiamHao 大佬,已经加到帖子里面去了,麻烦再帮忙看看
关联的键都在 hasMany 第二个参数

3年前 评论
LiamHao 3年前
LiamHao 3年前
wakamono (作者) (楼主) 3年前
wakamono (作者) (楼主) 3年前
LiamHao 3年前
wakamono (作者) (楼主) 3年前
LiamHao 3年前
wakamono (作者) (楼主) 3年前
wakamono (作者) (楼主) 3年前
LiamHao 3年前
wakamono (作者) (楼主) 3年前
LiamHao 3年前
wakamono (作者) (楼主) 3年前
LiamHao 3年前
LiamHao 3年前
wakamono (作者) (楼主) 3年前
wakamono (作者) (楼主) 3年前
LiamHao 3年前
wakamono (作者) (楼主) 3年前
LiamHao 3年前
wakamono (作者) (楼主) 3年前
LiamHao 3年前
wakamono (作者) (楼主) 3年前
wakamono (作者) (楼主) 3年前
讨论数量: 6

发一下你怎么写的 QueryBuilder 啊。还有你的关联关系要指明关联的两个键名,你这只写一个,不确定是不是有问题。

3年前 评论

@LiamHao 大佬,已经加到帖子里面去了,麻烦再帮忙看看
关联的键都在 hasMany 第二个参数

3年前 评论
LiamHao 3年前
LiamHao 3年前
wakamono (作者) (楼主) 3年前
wakamono (作者) (楼主) 3年前
LiamHao 3年前
wakamono (作者) (楼主) 3年前
LiamHao 3年前
wakamono (作者) (楼主) 3年前
wakamono (作者) (楼主) 3年前
LiamHao 3年前
wakamono (作者) (楼主) 3年前
LiamHao 3年前
wakamono (作者) (楼主) 3年前
LiamHao 3年前
LiamHao 3年前
wakamono (作者) (楼主) 3年前
wakamono (作者) (楼主) 3年前
LiamHao 3年前
wakamono (作者) (楼主) 3年前
LiamHao 3年前
wakamono (作者) (楼主) 3年前
LiamHao 3年前
wakamono (作者) (楼主) 3年前
wakamono (作者) (楼主) 3年前

感觉你表复杂了

数据库
books table
-id
-bookname

person table
-id
-name
-type  (fanyi/zuozhe)

book-person table
-book_id
-person_id

book 和 person 多对多关系

3年前 评论
wakamono (楼主) 3年前

以你原始需求来说,我觉得可以用远层一对多来实现,我本地建表并测试了一下:

// class TableA 
public function zuozhe()
{
    return $this->hasManyThrough('TableD', 'TableB', 'book_id', 'zuozhe_id', 'book_id', 'zuozhe_id');
}

获取时使用

TableA::with('zuozhe')->get()->toArray();

即可获得如下数据,翻译(table c, e) 同理

array:1 [
  0 => array:3 [
    "id" => 1
    "book_id" => 1
    "zuozhe" => array:2 [
      0 => array:3 [
        "zuozhe_id" => 1
        "zuozhe_name" => "张三"
        "laravel_through_key" => 1
      ]
      1 => array:3 [
        "zuozhe_id" => 2
        "zuozhe_name" => "李四"
        "laravel_through_key" => 1
      ]
    ]
  ]
]

3年前 评论
wakamono (楼主) 3年前

一本书多个作者,多个翻译就是就是一对多了。模型关联《Laravel 8 中文文档》

3年前 评论

@WaKA 直接这么写是出不来的,因为我后台用的是Dcat Admin后台,貌似Dcat Admin后台语法哪不对了。。

3年前 评论

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