返回

如何在 Laravel Eloquent 中通过第 3 个模型筛选父/子 N 对多条件?

php

通过第 3 个模型对父/子 N 对多条件进行筛选:Laravel Eloquent 入门

前言

在本文中,我们将探讨如何使用 Laravel Eloquent 中的 whereHas() 方法对具有多对多关系的模型进行筛选。通过引入一个额外的模型(即第 3 个模型),我们可以建立更复杂的关系查询,从而实现更加精确的筛选操作。

使用 whereHas() 进行多重筛选

whereHas() 方法允许我们在父模型中查询相关子模型,并根据子模型的条件筛选父模型。其语法如下:

$parentModel->whereHas('childModelRelation', function ($query) {
    // 在此处定义子模型查询条件
});

示例:筛选与特定用户相关的模块

让我们以一个具体的示例来说明如何使用 whereHas() 进行多重筛选。假设我们有一个用户模型 User,一个模块模型 Module,以及一个连接用户和模块的中间模型 UserModule。我们的目标是筛选出仅包含与当前用户相关的子模块的模块。

$modules = auth()->user()->modules()->whereHas('subModules', function ($query) {
    $query->where('user_id', auth()->user()->id);
});

详细说明

  • auth()->user()->modules():从当前用户检索模块。
  • whereHas('subModules', function ($query) { ... }):筛选具有子模块关系的模块。
  • $query->where('user_id', auth()->user()->id):在子模块查询中添加一个条件,以筛选出仅与当前用户相关的子模块。

完整示例

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\User;
use App\Module;

class ModuleController extends Controller
{
    public function index()
    {
        $modules = auth()->user()->modules()->whereHas('subModules', function ($query) {
            $query->where('user_id', auth()->user()->id);
        });

        return view('modules.index', compact('modules'));
    }
}

注意事项

  • 确保中间模型表具有连接父模型和子模型的相应字段。
  • 确保父模型和子模型都定义了适当的关系方法。
  • 确保 whereHas() 查询中的子模型条件与需要筛选的属性相关。

结论

使用 Laravel Eloquent 的 whereHas() 方法,我们可以轻松地对具有多对多关系的模型进行多重筛选。通过引入第 3 个模型,我们可以构建更复杂的查询条件,从而实现更加精确和高效的筛选操作。这对于需要根据复杂关系对数据进行筛选的应用程序非常有用。

常见问题解答

  • 问:如何筛选具有多个子模型条件的模块?

    • 答: 可以使用多个 whereHas() 调用来定义多个子模型查询条件。
  • 问:whereHas() 方法支持嵌套查询吗?

    • 答: 是的,whereHas() 查询可以嵌套,以便在同一查询中筛选多个子模型。
  • 问:如何筛选不包含特定子模型的模块?

    • 答: 使用 doesntHave() 方法来筛选不包含特定子模型的模型。
  • 问:whereHas()has() 方法有什么区别?

    • 答: whereHas() 根据子模型的条件筛选父模型,而 has() 仅检查父模型是否具有任何相关子模型。
  • 问:如何使用 whereHas() 在子模型中筛选多列?

    • 答: 在子模型查询中使用 whereorWhere 方法来根据多列进行筛选。