【问题标题】:Laravel Many to Many (3 and 3+ Models) Design QuestionsLaravel 多对多(3 和 3+ 模型)设计问题
【发布时间】:2018-12-02 17:06:31
【问题描述】:

我有三个模型

联系人模型

联系人角色模型

项目模型

设置;

联系人可以属于多个项目。 (多对多)

每个项目都有由用户创建的自己的联系人角色。 (一对多 - 角色特定于项目)

在选定的项目中,一个联系人可以分配到多个角色(多对多)

棘手的部分是我有角色模型的类别,当用户创建角色时,他们从下拉列表中为该角色选择一个类别(从数据库中,总共 7 个预定义类别)。

然后我尝试做的事情和理解有问题;

1.在特定项目中显示具有给定角色的所有联系人的最佳方式是什么?

我可以很容易地获得$project->contacts() //this gives me all contacts within that project,但我需要更进一步,在那里我可以联系到他们的角色。

2.此外,我将如何显示属于该项目的所选类别的所有联系人?

3.我应该在我的模型之间使用不同的连接而不是多对多,比如有很多通过吗?

【问题讨论】:

    标签: laravel laravel-5


    【解决方案1】:

    假设 - 与

    显示

    你的意思实际上是用 eloquent 检索。

    忠告 - 阅读文档! Laravel 有很棒且易于理解的文档。

    https://laravel.com/docs/5.7/eloquent-relationships#eager-loading

    1) 我可以轻松获得 $project->contacts() //这为我提供了该项目中的所有联系人,但我需要更进一步,在那里我可以获得具有他们角色的联系人。

    嵌套预加载:

    $project = Project::with('contacts.roles')->find($id);
    

    2) 此外,我将如何显示属于该项目的所选类别的所有联系人?

    约束急切加载和查询关系存在:

    $project = Project::with(['contacts', function($q) use ($categoryId) {
        $q->with('roles')->whereHas(['category' => function($q2) use ($categoryId) {
            $q2->whereId($categoryId);
        });
    }]);
    

    3.我应该在我的模型之间使用不同的连接而不是多对多,比如有很多通过吗?

    结构对我来说很好。

    【讨论】:

    • 非常感谢,它实际上清理了我的控制器。根据在我的刀片视图文件中显示检索到的数据,我只是做 foreach 语句正确吗?例如,如果我想在旁边显示我的联系人姓名和他们的角色,@foreach ($project->contacts as $contact) {{$contact->firstname}} {{$contact->contactrole->label }} @endforeach 如果我有该特定联系人的第二个角色怎么办?我应该在该 foreach 语句中再做一次 foreach 吗?这是我第一次在框架内编码,术语不太好。我会继续阅读文档。
    • 是的,你只要@foreach ($project->contacts as $contact) {{ $contact->firstname }} @foreach ($contact->contactrole as $role) {{ $role->label }} @endforeach @endforeach
    • @foreach ($project->contacts as $contact) @foreach ($contact->contactrole as $role) @if ($role->group == 'owner') <li> {{$contact->firstname}} - {{$role->label}} </li> @endif @endforeach @endforeach 如果联系人有说 2 个角色(比如一个所有者,一个团队) - 上面,如果检查,我可以在我的页面上的相关位置列出数据。但它会显示两次,我该如何防止这种情况?还是我应该在问题 2 中使用您的答案?
    • 我会说你有两个角色 $contact 有一个所有者组。检查您的数据库。但这已不在此问题的范围内,因此如果您仍有问题,您应该提出一个新问题。
    猜你喜欢
    • 2021-07-25
    • 2018-12-12
    • 2021-05-25
    • 2017-08-26
    • 2011-11-18
    • 1970-01-01
    • 2011-06-29
    • 1970-01-01
    相关资源
    最近更新 更多