【问题标题】:problem with Using pivot table with Eloquent and Laravel在 Eloquent 和 Laravel 中使用数据透视表的问题
【发布时间】:2020-03-30 15:42:40
【问题描述】:

这是我的问题。我有一个名为 user 的表和一个名为 Skills 的表,还有一个连接这两个表的数据透视表,称为 EmployeeSkill。我正在尝试获取属于用户的技能,但是当我使用修补程序时,它返回基表或未找到视图:1146 表'pfe_sirh_db.skill_user'不存在(SQL:选择skills.*,skill_user .user_id as pivot_user_id, skill_user.skill_id as pivot_skill_id, skill_user.employee_id as pivot_employee_id from skills 987654332@ on @98 skill_user.skill_id where skill_user.user_id = 1)' 并且通过它返回这个“withTimestamps”的方式使用swagger:false

    class User extends Authenticatable{

protected $table = "users";
   public function skills()
    {
        return $this->belongsToMany(Skill::class);
    }
}

   class Skill extends Model
    {
       public function User()
        {
            return $this->belongsToMany(User::class);
        }

}

和数据透视表

    class EmployeeSkill extends Model
{
    protected $table = "employee_skills";

    protected $fillable = [
        'employee_id', 'skill_id', 'note'
    ];


}

【问题讨论】:

    标签: mysql laravel eloquent eloquent-relationship laragon


    【解决方案1】:

    您的数据透视表应按照它们所属的模型名称命名为skill_user单数)。而且您不需要 EmployeeSkill 模型来使这种关系起作用,您只需要表格即可。

    documentation中所说:

    为了确定关系的连接表的表名,Eloquent 会按字母顺序连接两个相关的模型名。但是,您可以随意覆盖此约定。您可以通过将第二个参数传递给 belongsToMany 方法来做到这一点

    然后你应该排除这一行:

    protected $table = "employee_skills";

    将您的表名更改为skill_user

    在您的数据透视表中,您应该使用user_id 作为外键

    您可以通过以下方式检索用户的所有技能:

    $user = User::find(1); $user->skills();

    这将为您提供 ID 为 1 的用户的所有技能

    请注意,您可以使用任何表名和任何外键名,但如果这样做,您需要在关系上指定名称。所以我建议你按照我告诉你的去做,因为这是标准方式

    【讨论】:

    • $user->skills(); => Illuminate\Database\Eloquent\Relations\BelongsToMany {#3054 +withTimestamps: false,
    • $user->skills;用消息'SQLSTATE [42S22]照亮/数据库/查询异常:找不到列:1054'字段列表'中的未知列'employee_skill.user_id'(SQL:选择skills.*,employee_skill.user_id作为@987654330 @, employee_skill.skill_id as pivot_skill_id from skills inner join employee_skill on skills.id = employee_skill.skill_id where employee_skill=.employee_skill.@987
    • 嘿,我意识到我犯了一些错误。现在看看我的答案
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-30
    • 1970-01-01
    • 2018-11-11
    • 2015-06-24
    • 2018-12-16
    相关资源
    最近更新 更多