关于laravel9多表联查的求助

我之前一直是使用thinkphp的,而联查之前是一直在使用join,可是最近切换到laravel9后发现join好像和原来用的tp完全不一样。然后我这边有三层表结构依次关联,我想最终获取一个list,list里面可选的显示某些字段,比如a表的id和tite,b表的name,c表的username,在尝试过Joins方法和whereColumn方法后依然没有达到预期的效果,也有请教朋友,但是最终得到的解答是用循环,可是我又不想使用循环,想用原来用tp的joinleft的方式来获取,但一直没有思绪也没有检索到相关答案,所以来社区提问,哪位大大能给个思路或demo。感谢

想拿到数据的结果和结构

[
    {
        "id":1,
        "title":"我是id为1的数据",
        "bTable":[
            {
                "name":"武汉"
            },
            {
                "name":"北京"
            },
            {
                "name":"上海"
            }
        ],
        "cTable":[
            {
                "username":"张三"
            },
            {
                "username":"李四"
            }
        ]
    }
]

A表结构和数据

id title
1 我是id为1的数据
2 我是id为2的数据
3 我是id为3的数据

B表结构

使用Aid与A表的id关联

bid aid name
1 1 武汉
2 1 北京
3 1 上海
4 2 北京
5 3 南京

C表的结构

使用aid字段与A表的id关联
使用mid与B表的bid关联

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

    $data = A::query()->with([
              'b:aid,name',
              'c:aid,username',
          ])->first()->toArray();

    OR

  • 第二种

    
    $data = A::query()->with([
        'b',
        'c',
      ])->first()->toArray();
    
    public function b(): HasMany
      {
          return $this->hasMany(B::class,'aid')->select('aid','name');
      }
    
      public function c(): HasMany
      {
          return $this->hasMany(C::class,'aid')->select('aid','username');
      }
1年前 评论
阿噗 (作者) 1年前
阿噗 (作者) 1年前
Frees (楼主) 1年前
Frees (楼主) 1年前
Frees (楼主) 1年前
讨论数量: 10
slowlyo

模型关联 / 一对多

// 你的a表的模型
class A extends Model
{
    /**
     * 一对多关联b表
     */
    public function bs()
    {
        return $this->hasMany(B::class, 'aid');
    }

    public function cs()
    {
        return $this->hasMany(C::class, 'aid');
    }
}

// ...

// 查询这么写

$aid = 1;
$data = A::with(['bs', 'cs'])->find($aid);

// $data 的值是对象可以使用 toArray() 方法转成数组
$data = $data->toArray();
1年前 评论
slowlyo (作者) 1年前
Frees (楼主) 1年前

$data = A::with(['bs:aid,name', 'cs:aid,name'])->get([‘id’,’tltle’]); 关联里的aid自行去掉测试看看行不行

1年前 评论
  • 第一种:

    $data = A::query()->with([
              'b:aid,name',
              'c:aid,username',
          ])->first()->toArray();

    OR

  • 第二种

    
    $data = A::query()->with([
        'b',
        'c',
      ])->first()->toArray();
    
    public function b(): HasMany
      {
          return $this->hasMany(B::class,'aid')->select('aid','name');
      }
    
      public function c(): HasMany
      {
          return $this->hasMany(C::class,'aid')->select('aid','username');
      }
1年前 评论
阿噗 (作者) 1年前
阿噗 (作者) 1年前
Frees (楼主) 1年前
Frees (楼主) 1年前
Frees (楼主) 1年前

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