【问题标题】:Laravel + nullable foreign keysLaravel +可为空的外键
【发布时间】:2014-05-03 23:36:58
【问题描述】:

我有一个带有下拉选项的表单,可让您为特定模型选择外键。顶部选项总是类似

<option value="">please select</option>

所以当我用表单中的这些数据填充我的模型时,

$booking = new Booking($data);

并尝试保存它,

$booking->save();

它总是失败,因为这违反了 FK 约束,因为 Laravel 不够聪明,无法为我取消该字段。因此我想出了这个小技巧:

public function save() {
    if(!$this->vehicle_id) $this->vehicle_id = null;
    if(!$this->driver_id) $this->driver_id = null;
    parent::save();
}

但是有没有办法告诉 Laravel 哪些字段代表 FK,如果它们是整数 > 0 则应该设置为 null?

【问题讨论】:

标签: laravel


【解决方案1】:

一种可能的解决方案是对所有外键使用set mutators:

public function setVehicleIdAttribute($value) {
    $this->attributes['vehicle_id'] = $value ?: null;
}

public function setDriverIdAttribute($value) {
    $this->attributes['driver_id'] = $value ?: null;
}

【讨论】:

  • 对我花了很长时间才弄清楚的事情的好答案。一个可能有帮助的注意事项:记住用 ID 命名 mutator —— 即它不是改变关系函数,而是改变 db 字段。根据上面的示例,我犯了在函数之后调用函数“setVehicleAttribute”而不是“setVehicleIdAttribute”的错误。然后 Laravel 错过了捕获 mutator。事后看来很明显..但花了很长时间才找到。
  • 是的!我将销售税字段设置为可为空,并且在我的选择中,我有一个“免税”选项,其中值设置为空,但每当我尝试创建记录时,我仍然会收到外键约束错误。这是一个很好的解决方案,谢谢!
猜你喜欢
  • 2019-11-07
  • 2021-12-02
  • 2014-01-17
  • 2018-07-08
  • 2015-08-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-06-15
相关资源
最近更新 更多