我有一个有很多字段的表单,每个表单都必须作为不同的行添加到表中。集体指派问题
我的表看起来像这样:
| Category | Device | Value |
|----------|:-------|-------------|
| 2 | 1 | some value |
| 3 | 1 | other value |
| 7 | 3 | etc |
的类别和设备实际上是从Categories
和Devices
表的外键。它们也应该是唯一的,这意味着不能有Category: 2
和Device: 1
两次。如果它们已经存在,则值应该更新。
类别和值被从表格中检索和它看起来像这样:
{"2":"some value","3":"other value","5":"etc","6":"something","8":"can be empty"}
该装置还来自于数形式,但将是相同的。
现在我需要在我的数据库中输入所有内容,我正在寻找一个简单的解决方案。
但它会做大约100个查询(每个输入一个),我相信必须有更好的解决方案。
如果来自表单的值之一为空,则应该忽略它。
这是我目前工作的代码,也许可以更好地理解:
public function postSpecs(Request $request)
{
$specs = $request->except(['_token', 'deviceid']);
foreach($specs as $key=>$val)
{
if($val == '') continue;
if(Spec::where('category', $key)->where('device', $request->deviceid)->exists())
{
$spec = Spec::where('category', $key)->where('device', $request->deviceid)->first();
$spec->value = $val;
$spec->save();
}
else
{
$spec = new Spec;
$spec->category = $key;
$spec->device = $request->deviceid;
$spec->value = $val;
$spec->save();
}
}
}
我忘了一些东西。如果存在,我也需要更新它。所以如果我已经有行'category:2,device:1',它应该被更新。 – Alex
在雄辩中没有真正的解决方案。不幸的是,你必须使用原始查询。或者您可以搜索需要更新的所有记录并逐个更新它们并批量插入新记录。你也可以使用updateOrCreate方法。 'Model :: updateOrCreate( ['primary_key'=> 8], ['field'=>'value','another_field'=>'another value'] );' –
@Alex编辑为您的代码 –