【问题标题】:Laravel 8: Error when using pivot in an empty many to many relationshipLaravel 8:在空的多对多关系中使用枢轴时出错
【发布时间】:2021-11-25 19:55:08
【问题描述】:

我有以下表格:

表格

用户

  • 身份证
  • 电子邮件

组织

  • 身份证
  • 姓名

组织成员

  • 身份证
  • organisation_id(FK 到组织)
  • user_id(FK 到用户)
  • 角色

关系

  • 用户与组织成员是一对多的关系。
  • 组织成员与组织之间是多对一的关系
  • 所以用户到组织成员是多对多关系,组织成员作为中间表。

雄辩的模型

模型如下:

Class User {
   public function organisationMembers(): HasMany
   {
        return $this->hasMany(OrganisationMember::class);
   }

   public function organisations(): BelongsToMany
   {
        return $this->belongsToMany(Organisation::class, 'organisation_members')
            ->withPivot('role');;
   }
}
class Organisation {
    public function organisationMembers(): HasMany
    {
        return $this->hasMany(OrganisationMember::class);
    }

    public function users(): BelongsToMany
    {
        return $this->belongsToMany(Organisation::class, 'organisation_members')
            ->using(OrganisationMember::class);
    }
}
class OrganisationMember {
    public function organisation(): BelongsTo
    {
        return $this->belongsTo(Organisation::class)->withTrashed();
    }

    public function user(): BelongsTo
    {
        return $this->belongsTo(User::class);
    }
}

问题

对于以下代码:

$organisations = User::find($id)->organisations

当用户有组织时,它会按预期工作。

但是,当我对没有组织的用户执行此方法时,我得到的不是空集合,而是以下内容:

Illuminate\Database\QueryException with message 'SQLSTATE[42S22]: Column not found: 1054 Unknown column 'organisation_members.role' in 'field list'
(SQL: select `organisations`.*,
`organisation_members`.`user_id` as `pivot_user_id`,
`organisation_members`.`organisation_id` as `pivot_organisation_id`,
`organisation_members`.`role` as `pivot_role` from `organisations` inner join
`organisation_members` on `organisations`.`id` = `organisation_members`.`organisation_id`
where `organisation_members`.`user_id` = 109 and `organisations`.`deleted_at` is null)'

但是,如果我修改用户模型,并删除 pivot 部分:

Class User {
   // ...

   public function organisations(): BelongsToMany
   {
        return $this->belongsToMany(Organisation::class, 'organisation_members');
   }
}

它按预期返回一个空集合。

我该如何解决这个问题?

【问题讨论】:

    标签: php laravel eloquent laravel-8


    【解决方案1】:

    您的代码似乎在这里工作,即使在 User 类中使用枢轴

    >>> return User::find(1)->organisations;
    => Illuminate\Database\Eloquent\Collection {#3464
         all: [
           App\Models\Organization {#3457
             id: 1,
             name: "hello",
             created_at: "2021-10-05 22:50:19",
             updated_at: "2021-10-05 22:50:19",
             pivot: Illuminate\Database\Eloquent\Relations\Pivot {#4251
               user_id: 1,
               organization_id: 1,
               role: "f",
             },
           },
         ],
       }
    
    >>> return User::find(3)->organisations;
    => Illuminate\Database\Eloquent\Collection {#4396
         all: [],
       }
    >>>
    

    执行相同的查询

    select `organizations`.*, `organisation_members`.`user_id` as `pivot_user_id`, `organisation_members`.`organization_id` as `pivot_organization_id`, `organisation_members`.`role` as `pivot_role` from `organizations` inner join `organisation_members` on `organizations`.`id` = `organisation_members`.`organization_id` where `organisation_members`.`user_id` = 3
    
    

    但是组织类中的关系有一个错误:

    class Organisation {
        public function organisationMembers(): HasMany
        {
            return $this->hasMany(OrganisationMember::class);
        }
    
        public function users(): BelongsToMany
        {
            return $this->belongsToMany(Organisation::class, 'organisation_members')
                ->using(OrganisationMember::class);
        }
    }
    
    

    您需要使用 User 类将 belongsToMany 第一个参数更改为这样

    class Organisation {
    
        public function organisationMembers(): HasMany
        {
            return $this->hasMany(OrganisationMember::class);
        }
    
        public function users(): BelongsToMany
        {
            return $this->belongsToMany(User::class, 'organisation_members')
                ->using(OrganisationMember::class);
        }
    }
    
    

    在此处查看文档:Laravel Eloquent

    【讨论】:

    • 感谢您发现这一点。实际问题是我实际上重命名了“角色”列,而它实际上并不存在。所以基本上我是个笨蛋。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-08-12
    • 2020-07-15
    • 2019-08-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-05
    相关资源
    最近更新 更多