Laravel 表单一次性插入
Posted
技术标签:
【中文标题】Laravel 表单一次性插入【英文标题】:Laravel form insert in one go 【发布时间】:2015-06-29 12:35:26 【问题描述】:我创建了一个包含 10 多个字段的普通 html 表单。其中一个字段是提交按钮(显然没有人愿意将其存储在数据库中)。我正在尝试使用 Product 模型中的以下语句将数据保存在表中:
在控制器中:
$id = Product::saveFormData(Input::all());
在模型中:
$id = DB::table('products')->insertGetId($data);
它给了我以下错误:
找不到列:1054 '字段列表'中的未知列'btncreateproduct'(SQL:插入
products
(name
,url_key
,sku
,quantity
,price
,specialprice
,description
,preorder
,page_title
,header_data
,custom_json_data
,btncreateproduct
,category_id
) 值 (abc, aaa, bbb, 11, 2222, 1111, abcasdf, no, asdf, asdf , asdf, 创建产品, 2))'
现在,首先,为什么将btncreateproduct
视为一个字段。我不想在模型中指定字段列表,因为我希望此代码具有可扩展性(用户可以添加任意数量的字段)。
其次,值 abc、aaa 不像 'abc'、'aaa'
这意味着在当前时刻,它没有将它们视为字符串值。虽然它们是在数据库中定义的varchar。
【问题讨论】:
嗨!你能发布你的HTML吗?您的提交按钮可能不是submit
。
【参考方案1】:
您使用 QueryBuilder DB::table('products')...
而不是模型本身来保存新产品的可能原因是什么?
在任何情况下,您都可以按照以下方式做一些事情
$input = Input::except(['btncreateproduct']);
$newProduct = Product::create($input);
$id = $newProduct->id;
话虽如此,您更好进行适当的验证和类型转换并手动分配这些值,因为在某些时候,表架构或表单都会改变并破坏您的代码。
【讨论】:
谢谢彼得,我会避开 DB::table。【参考方案2】:关于按钮
你的按钮是你提交的一部分的原因是你放了属性名。
请参阅here 以供参考。
你可以用这个来测试:
<?php var_dump($_POST); ?>
<form action="index.php" method="post" id="form1">
<button type="submit" name="test" value="Submit1">Submit A</button>
<button type="submit" value="Submit2">Submit B</button>
</form>
关于在数据库中创建条目
您在代码中尝试执行的操作称为Massive Assignment,非常危险且不安全。
因此,按照建议,您应该使用 Product::create()
来使用您的模型。
除了模型Product
中的内容之外,您还必须插入属性$fillable
。
namespace App;
use Illuminate\Database\Eloquent\Model;
class Product extends Model
// this is just an example, modify this part in accord to your needs
protected $fillable = [`name`, `url_key`, `sku`, `quantity`, `price`, `specialprice`, `description`, `preorder`, `page_title`, `header_data`, `custom_json_data`, `category_id`];
// other code here
【讨论】:
感谢 borracciaBlu 它有效。我想要的是一个可扩展的解决方案,比如我们将 Magento 中的自定义属性添加到产品中。无论如何,我会尝试找出一些解决方案。以上是关于Laravel 表单一次性插入的主要内容,如果未能解决你的问题,请参考以下文章
PHP笔记-laravel框架记录session中flash()的一次应用