【问题标题】:Relation between same users table相同用户表之间的关系
【发布时间】:2019-12-15 08:26:09
【问题描述】:

我有 3 个不同的角色(AdminCoachRunner)。一个用户只有一个角色。

问题是当我尝试将用户与角色 Coach 和用户与角色 Runner 相关联时。逻辑应用就是这个;我可以创建跑步者和教练,但每个跑步者只属于一位教练,一位教练有很多跑步者。

我怎样才能在同一个用户表上处理这个,然后在用户模型和他们的关系上。

【问题讨论】:

  • 如果您将“用户”表拆分为 3 个表:管理员、教练、跑步者 - 它们是否相同?
  • 嗯,一开始我为单独的 Coach 和 Runner 表建模,但我想要一种简化。我正在考虑恢复这个想法并取回与用户 ID 相关联的教练和跑步者表。
  • 如果在users 表中创建列coach_id 会怎样?它可以为空,并且只需要指定跑步者。
  • @Makros 我想暗示的是-如果您的管理员、教练和跑步者表具有相同的列-那么当然,您应该只使用一个表-但可能有一个列是枚举还是位标志?

标签: php database laravel eloquent roles


【解决方案1】:

首先,您需要您的外键为nullable,您可以在用户的​​migration 文件中指定:

your_migration_file.php

public function up()
{
    Schema::create('users', function (Blueprint $table) {
        $table->bigIncrements('id');
        $table->string('name');
        // your columns
        $table->unsignedBigInteger('coach_id')->nullable();  // <-----
    }); //                                    ^^^^^^^^^^^^
}

请注意,这样做您将无法添加数据库约束,但无论如何这都不是必需的。另外,您可能需要refresh your migrations

然后在您的User 模型中,您需要定义您的关系:

User.php

class User extends Model {

    /** a Runner has a Coach. */
    public function coach()
    {
        return $this->belongsTo(User::class, 'coach_id');
    }

    /** a Coach teaches many Runners */
    public function runners()
    {
        return $this->hasMany(User::class, 'coach_id');
    }

然后您可以对eager load 进行查询并限制结果:

YourController.php

public function myCoolFunction()
{
    $runners = User::with('coach')->whereNotNull('coach_id')->get();
    $coaches = User::with('runners')->whereNull('coach_id')->get();
}

当然,这些查询看起来很难看,所以你也可以在 User 模型中定义 local query scopes

class User extends Model {

    // some code..

    public function scopeCoaches($query)
    {
        return $query->hasRole('coach'); // maybe you use a role package?            
     // return $query->whereNull('coach_id'); // or my basic approach used before
    }

    public function scopeRunners($query)
    {
        return $query->hasRole('srunner'); // maybe you use a role package?            
     // return $query->whereNotNull('coach_id'); // or my basic approach used before
    }
}

然后只需使用您的范围:

public function myCoolFunction()
{
    $runners = User::with('coach')->coaches()->get();
    $coaches = User::with('runners')->runners()->get();
}

【讨论】:

  • 非常感谢@HCK。正是我需要的。
猜你喜欢
  • 1970-01-01
  • 2018-07-11
  • 2019-09-26
  • 1970-01-01
  • 1970-01-01
  • 2014-12-05
  • 2013-01-03
  • 2016-09-03
相关资源
最近更新 更多