laravel 多对多关系的奇怪行为

Strange behavior on laravel many to many relationship

我有两个模型 User 和 Tenant,在我的项目中,一个 User 可以有多个 Tenant 连接到他,Tenant 可以有多个用户连接到他。

这是我的用户模型

public function tenants()
{
    return $this->beLongsToMany(\App\Models\TenantsUsers::class, 'tenants_user', 'user_id', 'tenant_id');
}

这是我的租户模型

public function users()
{
    return $this->beLongsToMany(\App\Models\TenantsUsers::class, 'tenants_user', 'tenant_id', 'user_id');
}

这是我的租户用户模型

class TenantsUsers extends Model
{
    use UtilTrait;
    use Notifiable;

    protected $table = 'tenants_user';

    protected function serializeDate(DateTimeInterface $date)
    {
        return $date->format('Y-m-d H:i:s');
    }

    /**
     * The attributes that should be casted to native types.
     *
     * @var array
     */
    protected $casts = [
        'user_id' => 'integer',
        'tenant_id' => 'integer'
    ];

    /**
     * @return \Illuminate\Database\Eloquent\Relations\BelongsToMany
     **/
    public function tenants()
    {
        return $this->hasMany(\App\Models\Tenant::class, 'tenant_id');
    }

    public function users()
    {
        return $this->hasMany(\App\Models\User::class, 'user_id');
    }

当我从存储库执行此函数时:

$userTemp = $this->userRepository->with(['tenants'])->findWhere(['email' => $userEmail])->first();

我收到了这个错误:

SQLSTATE[42712]: Duplicate alias: 7 ERROR: table name "typo_tenants_user" specified more than once (SQL: select
"typo_tenants_user".*, "typo_tenants_user"."user_id" as "pivot_user_id", "typo_tenants_user"."tenant_id" as
"pivot_tenant_id" from "typo_tenants_user" inner join "typo_tenants_user" on "typo_tenants_user"."id" =
"typo_tenants_user"."tenant_id" where "typo_tenants_user"."user_id" in (1))

我做错了什么?

您不需要为 Eloquent 多对多关系中的枢轴 table 创建模型。相反,在定义关系时使用相关模型的 class:

// User model

public function tenants()
{
    return $this->belongsToMany(\App\Models\Tenant::class, 'tenants_user', 'user_id', 'tenant_id');
}

// Tenant model

public function users()
{
    return $this->belongsToMany(\App\Models\User::class, 'tenants_user', 'tenant_id', 'user_id');
}

如果您按照 Eloquent naming conventions 将枢轴 table 定义为 tenant_user 而不是 tenants_user,事情甚至可以进一步简化为:

// User model

public function tenants()
{
    return $this->belongsToMany(\App\Models\Tenant::class);
}

// Tenant model

public function users()
{
    return $this->belongsToMany(\App\Models\User::class);
}