首页 > 解决方案 > Laravel在ManyToMany中获取哪些类别属于登录用户

问题描述

在我的简单博客 Web 应用程序中,我有一些categories存储users在数据库中,每个category可能属于一个或多个用户,我尝试让它们显示每个登录的用户,为了实现这个场景,我有这个表:

Schema::create('users', function (Blueprint $table) {
    $table->bigIncrements('id');
    $table->unsignedBigInteger('user_id')->index()->nullable();
    $table->foreign('user_id')->references('id')->on('users');
    $table->string('name')->nullable();
    $table->string('family')->nullable();
    $table->string('username')->unique();

    $table->rememberToken();
    $table->softDeletes();
    $table->timestamp('created_at')->useCurrent();
    $table->timestamp('updated_at')->useCurrent();
});

Schema::create('categories', function (Blueprint $table) {
    $table->bigIncrements('id');
    $table->unsignedBigInteger('category_id')->index()->nullable();
    $table->foreign('category_id')->references('id')->on('categories')->onDelete('cascade');
    $table->string('category_name');
    $table->softDeletes();
    $table->timestamp('created_at')->useCurrent();
    $table->timestamp('updated_at')->useCurrent();
});

然后,创建many to many表:

Schema::create('category_user', function (Blueprint $table) {
    $table->unsignedBigInteger('user_id')->index();
    $table->unsignedBigInteger('category_id')->index();
    $table->foreign('user_id')->references('id')->on('users')->onDelete('cascade');
    $table->foreign('category_id')->references('id')->on('categories')->onDelete('cascade');
    $table->primary(['user_id','category_id']);
});

现在我如何使用此代码获取登录用户的类别:

$categories = Category::whereNull('category_id')
    ->with(['childrenCategories', 'users' => function ($query) {
        //$query->where('id',auth()->user()->id);
    }])
    ->withCount('posts')
    ->get();

标签: phplaravel

解决方案


您可以查询关系是否存在whereHas仅获取属于经过身份验证的用户的类别。

$categories = Category::whereNull('category_id')
    ->whereHas('users', function ($query) {
        $query->where('id', auth()->user()->id);
    })
    ->with([
        'childrenCategories', 
        'users' => function ($query) {
            $query->where('id', auth()->user()->id);
        }
    ])
    ->withCount('posts')
    ->get();

推荐阅读