当前位置: 首页 > 知识库问答 >
问题:

如何在PHPLaravel中从3个与pivot连接的表中获取数据

汝跃
2023-03-14

我面临一个无法通过透视表检索数据的问题,

在我的应用程序中,有一个单独的表来存储文件数据,一个单独的表来存储比赛,一个单独的表来存储团队。

还有一个名为competition\u file的表,其中包含competition\u id、team\u id、file\u id

用户可以通过选择一个团队或不选择一个团队来添加多个文件到比赛中,如下图所示

它将被同步到competition_file表,如下图所示

我需要将UI中的所有数据显示为下图所示的表格

我想知道如何填写使用透视表选择的团队名称

文件模型中的关系

 public function teams()
{
   return $this->belongsToMany(Team::class,'competition_file')->wherePivot('type','document');
}

竞争模型中的关系

    public function documents()
{
    return $this->belongsToMany(File::class,'competition_file','competition_id', 'file_id')->wherePivot('type','document');
}

这是我的控制器索引函数

 public function index($id)
    {
        $competition = $this->competitionsRepo->find($id,[
            'team',
            'documents',
        ]);

        return view('competitions.document',[
          
            'competition'=>$competition,
        ]);
    }

我的刀片

    @foreach ($competition->documents as $key=>$document)
                                <tr>
                                    <td>{{ $key+1 }}</td>
                                    <td>{{ $document->name }}</td>
                                    <td>-</td>
                                    <td>{{ $document->created_at->toDateString() }}</td>
                                    <td>
                                        <form class="confirm" action="{{ route('documents.destroy',['competition'=>$competition,'document'=> $document->id]) }}" method="POST"
                                            data-confirm-title="Remove Document?"
                                            data-confirm-message="Are you sure you want to remove this document?">
                                            @csrf
                                            @method('DELETE')

                                            <button type="submit" name="button" class="button">Remove</button>
                                        </form>
                                    </td>
                                </tr>
   @endforeach

有人请帮我把球队的名字记在刀刃上

我希望我的问题是清楚的,请评论,如果它是生病编辑问题

共有1个答案

王才英
2023-03-14

我能够通过学习急切加载通过推荐来解决我的问题

这是我做的改变

控制器

public function index($id)
    {
        $competition = $this->competitionsRepo->findOrFail($id);

        $files = $competition->documents()->with(
            [
                'teams' => function($q) use ($competition) {
                    $q->with([
                        'documents' => function($q) use($competition) {
                            $q->where([
                                'competition_id' => $competition->id,
                            ]);
                        }
                    ]);
                },
            ]
        )->get();

        return view('competitions.document',[
            'id'=>$id,
            'competition'=>$competition,
            'files'=>$files,
        ]);

    }

在我的Blade表中,我使用了$file-

  <table class="table light-td sports-tbl tb-chg2 table-condensed table-borderless">
                        <thead>
                            <tr>
                                <th>#</th>
                                <th>Document Name</th>
                                <th>Assigned Team</th>
                                <th>Date Added</th>
                                <th>Action</th>
                            </tr>
                        </thead>
                        <tbody>

                              @foreach ($files as $key=>$file)
                              <tr>
                                <td>{{ $key+1 }}</td>
                                <td>
                                    <a href="{{ asset('storage/'. $file->file_path) }}" class="text-info" target="_blank">
                                        <img src="{{ asset('/images/sketches/1x/file.png') }}" alt="file">
                                    </a>
                                    {{ $file->name }}
                                </td>

                                <td>
                                    {!! $file->teams->isNotEmpty() ? $file->teams->implode('name') : '<span class="text-secondary">No teams selected</span>' !!}
                                </td>
                                <td>{{ $file->created_at->toDateString() }}</td>
                                <td>
                                    <form class="confirm" action="{{ route('documents.destroy',['competition'=>$id,'document'=> $file->id]) }}" method="POST"
                                        data-confirm-title="Remove Document?"
                                        data-confirm-message="Are you sure you want to remove this document?">
                                        @csrf
                                        @method('DELETE')

                                        <button type="submit" name="button" class="button">Remove</button>
                                    </form>
                                </td>
                              </tr>
                              @endforeach
                        </tbody>
 </table>

 类似资料:
  • 我有两张桌子,彼此相连。我如何使用Spring数据jpa从数据库中获取它们? 代码如下, 结果:结果

  • 我有两个表(休假,CompOff)我想以员工请求的形式向用户(前端)显示这些表数据。员工可以请求休假和compoff。两个表都有createdOn,empid列。我不知道如何获取两个表数据,然后返回一个包含两个表数据的列表。 离开桌子- 组合表- 在Springboot中,我创建了三个类name——leave、compoff和request。他们有一些创建/更新操作。现在在请求类中,我需要(离开,

  • 问题内容: 我想通过内部联接从更多表中选择数据。 这些是我的桌子。 我想写一份声明,显示学生去过哪个考试,年级和日期。日期后排序。 这是我的声明。它可以运行,但是我想确保自己做的正确。 问题答案: 几乎正确..查看联接,您引用的字段错误

  • 问题内容: 我有两个表: 这是表1: 这是表2: 现在,我想从这些表中获取数据。在两个表中都相同。 我想拿 和其他表。 请帮我做到这一点。 问题答案: 我假设您在第二个表中有一个命名字段(您没有列出它): 您应该查看有关的MySQL手册,因为这是编写SQL查询的非常基本的部分。您也可以考虑为product_id字段添加索引,以使查询运行更快。

  • 我的数据库中有一个小特例,我需要从两个具有一对一关系的不同表中获取数据,以获得有用的结果。获取看起来像这样: 当然,我在实际代码中使用了-这只是一个示例。我的问题是是否以及如何将jOOQ中获取的数据写入POJO。我不确定是否有办法让jOOQ为我生成这个POJO,但如果我必须自己编写它,我假设我需要像适配器这样的东西以及像作为数据类型的转换器。 我看到有可能出现RecordMapperProvide

  • 我有一张siswa和kelas的联合表格。在kelas表中有一列idSiswa,它来自siswa表的id。问题是当kelas加入时,我如何从他那里获得id。当我尝试获取id时,它显示了来自siswa表的id,而不是来自kelas表的id,我也已经使用了右连接和左连接,但仍然没有得到答案 我使用来自laravel的查询生成器来运行查询,这是我的查询