我正在Laravel建立一个网站。
我在InnoDB表中设置了外键约束。
我的问题是,如果我没有在选择框中选择一个值,框架会尝试使用''(空字符串)插入或更新表中的记录。这导致MySQL错误,因为它无法在子表中找到等效的外键值。
是否有一些优雅的方法来强制在外键字段中插入NULL而不是检出每个字段?或者强制MySQL接受''作为“null”外键引用?
换句话说:我有一个SELECT字段,第一个OPTION为空。我选择了空白的OPTION。当我提交时,传递一个空字符串''。在MySQL中显然我可以做UPDATE表SET foreignKey = NULL而不是UPDATE表SET foreignKey =''。它不会“转换”为NULL。我可以逐个检查字段,但是为每个外键将''转换为NULL,也许在数组中指定它们,我想知道是否有更简化的方法来执行此操作。
可能必须在我的数据库架构中更改我的ON UPDATE操作(未设置)?
编辑:列DO接受NULL值,问题在于框架或MySQL如何处理来自HTML的“空值”。我不是建议MySQL“做错了”,它也是合乎逻辑的,问题是你不能在HTML中设置“NULL”值,我想知道是否有一种优雅的方法来管理这个问题。 MySQL 或 Laravel。
换句话说,我是否必须手动指定外键并相应地构造我的查询,还是有另一种强大而优雅的方式?
到目前为止我的代码模型MyModel:
$obj = new MyModel;
$obj->fill(Input::all())); // can be all() or a subset of the request fields
$obj->save();
答案 0 :(得分:7)
至少从Laravel(和Eloquent模型)的v4开始,你可以使用mutators(也就是setter)来检查一个值是否为空并将其转换为null,并且该逻辑很好地放入模型中:
class Anything extends \Eloquent {
// ...
public function setFooBarAttribute($value) {
$this->attributes['foo_bar'] = empty($value)?null:$value;
}
}
您可以查看doc on mutators。
我已被这个github issue定位(不完全相关但仍然)。
答案 1 :(得分:1)
而不是使用
$obj = new MyModel;
$obj->fill(Input::all())); // can be all() or a subset of the request fields
$obj->save();
使用
$obj = new MyModel;
$obj->fieldName1 = Input::get('formField1');
$obj->fieldName2 = Input::has('formField2') && Input::get('formField2') == 'someValue' ? Input::get('formField2') : null;
// ...
$obj->save();
确保您的数据库field
接受null
值。另外,您可以从null
设置默认值database/phpmyadmin
。
答案 2 :(得分:0)
您必须从映射外键的字段中删除“not null”属性。
答案 3 :(得分:0)
在模型中添加以下功能。
public function setFooBarAttribute($value)
{
$this->attributes['foo_bar'] = $value?:null;
}