【问题标题】:Laravel 5.8 many to many relation using custom column names for pivot tableLaravel 5.8 使用数据透视表的自定义列名的多对多关系
【发布时间】:2019-09-27 00:01:56
【问题描述】:

我有两张表 user_detailslocation 如下:

user_details
    user_id (INTEGER PRIMARY KEY)
    ......

location
    id (INTEGER UNSIGNED PRIMARY KEY)
    ......

这两个表以多对可能的关系相互关联。现在我正在使用如下所示的数据透视表location_user_details

location_user_details
    id (INTEGER UNSIGNED PRIMARY KEY),
    user_id (INTEGER FOREIGN KEY REFERENCES use_details.user_id)
    location_id (INTEGER FOREIGN KEY REFERENCES location.id)
    type (VARCHAR)

模型UserDetails的关系代码如下:

class UserDetails extends Model
{
    protected $primaryKey = 'user_id';
    ........
    public function location(){
        return $this->belongsToMany(Location::class, 'location_user_details', 'user_id', 'id')->withPivot('type');
    }
}

模型Location的关系代码如下:

class Location extends Model
{
    ......
    public function userDetails(){
        return $this->belongsToMany(UserDetails::class, 'location_user_details', 'id', 'user_id')->withPivot('type');
    }
}

现在在我的控制器中,我在通过以下代码保存 UserDetailsLocation 对象后创建关系:

$userDetails->location()->attach($location->id, ['type'=>'HEADQUARTER']);

当代码到达这行执行时,我得到以下异常:

SQLSTATE[HY000]:一般错误:1364 字段“location_id”没有默认值(SQL:插入location_user_detailsidtypeuser_id)值(1,HEADQUARTER, 0))

我想指出正在发生的两件事。

  1. 位置字段未进入查询以插入数据。
  2. user_id 的值是 0,它应该大于 0,因为数据正在插入到 user_details 表中。

现在在这里提一下,当我去数据库查找locationuser_details表中的数据时,发现所有数据都已插入。

现在我的问题是这段代码可能出了什么问题?

【问题讨论】:

    标签: mysql laravel many-to-many pivot-table laravel-5.8


    【解决方案1】:

    好吧,我终于找到了问题所在。关于这个主题的文档不多。实际上它在于使用函数belongsToManybelongsToManyfunction 最多需要 7 个参数。到目前为止,我可以解码前 4 个参数。

    第一个参数取相关模型的类。

    第二个参数取数据库中数据透视表的名称。

    第三个参数取数据透视表中列的名称,该列引用调用belongsToMany的模型。

    第四个参数取数据透视表中引用相关模型的列的名称。

    因此,模型 UserDetails 中函数 location 的代码如下所示:

    public function location(){
        return $this->belongsToMany(Location::class, 'location_user_details', 'user_id', 'location_id')->withPivot('type');
    }
    

    模型Location 中函数userDetails 的代码如下所示:

    public function userDetails(){
        return $this->belongsToMany(UserDetails::class, 'location_user_details', 'location_id', 'user_id')->withPivot('type');
    }
    

    我希望这对其他人有帮助。

    【讨论】:

      【解决方案2】:

      问题可能出在变量 $location 中,但在您创建它时并未显示。确保它是一个位置对象

      【讨论】:

      • @EricRF $location 存储Location 对象的新实例。然后我使用$location->save() 保存它。现在此代码已正确执行,因为我可以在数据库的 locations 表中找到数据。还要看问题#2。对象UserDetails 的ID 为0。这怎么可能?
      • 我想是因为你指定UserDetails中的主键是user_id
      • @EricRF 但我已经将user_id 声明为UserDetails 模型中的主键。请参阅上面问题部分中的代码
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-11-30
      • 1970-01-01
      • 2014-12-07
      • 2018-09-23
      • 2023-02-05
      相关资源
      最近更新 更多