【问题标题】:Strange behavior on laravel many to many relationshiplaravel 多对多关系上的奇怪行为
【发布时间】:2020-11-14 22:42:57
【问题描述】:

我有两个模型 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');
}

这是我的 TenantsUsers 模型

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))

我做错了什么?

【问题讨论】:

    标签: laravel eloquent many-to-many


    【解决方案1】:

    您无需为 Eloquent 多对多关系中的数据透视表创建模型。而是在定义关系时使用相关模型的类:

    // 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 将数据透视表定义为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);
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-02-16
      • 1970-01-01
      • 1970-01-01
      • 2019-05-06
      • 2018-06-15
      • 2018-01-22
      • 2016-02-26
      相关资源
      最近更新 更多