1

我有以下架构:

+------------+
| categories |
+------------+
| id         |
+------------+

+-------------+
| sections    |
+-------------+
| id          |
| category_id |
+-------------+

+------------+
| questions  |
+------------+
| id         |
| section_id |
+------------+

+------------+
| clients    |
+------------+
| id         |
+------------+

+-------------------+
| client_questions  |
+-------------------+
| client_id         |
| question_id       |
+-------------------+

如您所见,问题在部分中,部分在类别中。

系统管理员可以为每个单独的客户打开或关闭问题,因此我创建了 client_questions 来创建客户和问题之间的多对多关系。

现在,我想利用 Eloquent 的强大功能来获取客户的类别(列出所有问题),但我似乎无法完全理解查询构建器。

基本上我目前可以通过我在模型中定义的多对多关系来做 $client->questions:

public function questions() {
    return $this->belongsToMany(Question::class,'client_questions','client_id','question_id');
}

但考虑到分离程度,我似乎无法弄清楚如何在客户和类别之间做同样的事情。

基本上我想这样做$client->categories,然后我可以列出整个采访:

@foreach( $client->categories as $category)
  @foreach( $category->sections as $section)
    @foreach( $secion->questions as $question )
      {{ $question->question }}
    @endforeach
  @endforeach
@endforeach
4

2 回答 2

1

我已经在laravel 中通过具有深厚关系的雄辩模型循环回答了这个问题

但基本上你可以使用点符号将影响深远的模型加载到当前模型上,只要它们都与链条相关。

$questions->load(['sections.categories' => function($q) use(&$categories){
    $categories = $q->get();
}]);

这应该是所提供问题的所有类别。

请注意,这是一项昂贵的操作,因此如果集合太大,请准备好应对艰难,但这是除了我遇到的 foreaches 之外的唯一其他方法。

于 2019-05-13T19:09:56.187 回答
1

不幸的是,您将无法定义 和 之间的直接关系clientscategories但是,您可以使用现有的关系来获得您想要的。

为此,我建议混合使用with() (受约束的急切加载)whereHas并从Category模型开始:

$categories = Category::with([
    'sections.questions.clients' => function ($query) use ($clientId) {
        $query->where('id', $clientId);
    },
])->whereHas('sections.questions.clients', function ($query) use ($clientId) {
    $query->where('id', $clientId);
})->get();

您必须同时使用两者的原因是因为其中任何一个都可能导致您遇到与客户没有直接关系的问题。

于 2019-05-13T19:10:35.280 回答