Php ZF2表格-插入和更新表格
这更多的是一个方法/最佳实践的问题,而不是一个具体的技术问题,所以我来给你们一些指导 我的问题围绕Zend Framework 2表单,特别是我是否应该为插入实体和更新实体实现不同的表单 概述一个简化的用例。假设我的数据库中有一个product表。每个产品都有一个ID(Php ZF2表格-插入和更新表格,php,zend-framework2,Php,Zend Framework2,这更多的是一个方法/最佳实践的问题,而不是一个具体的技术问题,所以我来给你们一些指导 我的问题围绕Zend Framework 2表单,特别是我是否应该为插入实体和更新实体实现不同的表单 概述一个简化的用例。假设我的数据库中有一个product表。每个产品都有一个ID(product\u ID),它是主键和一个名称(name)。假设我存储的产品来自一家供应商,该供应商为我提供了一个唯一的产品id,我想将其用作数据库中的主键 现在,假设我已经实现了一个product\u字段集和一个product\
product\u ID
),它是主键和一个名称(name
)。假设我存储的产品来自一家供应商,该供应商为我提供了一个唯一的产品id,我想将其用作数据库中的主键
现在,假设我已经实现了一个product\u字段集
和一个product\u表单
,这两个都很好地工作。表单允许我指定产品ID和名称,并将其存储在数据库中。但是,当用户使用表单更新产品名称而不是插入新产品时,我不希望他们能够编辑产品ID,因为这是我的数据库主键
目前,我只能看到如何通过实现2个表单和2个字段集,在更新场景中以少一个字段(产品ID)的方式呈现表单
你将如何处理这个问题?当使用服务管理器/表单管理器收回表单时,我无法完全理解如何/在何处,甚至是否应该在表单中实现逻辑来处理此类情况
:wq首先:
假设我存储的产品来自一家供应商,该供应商为我提供了一个唯一的产品id,我想将其用作数据库中的主键
这是一个SKU编号。保留数据库管理的主键。如果有外部标识符,则单独存储该标识符
然后,我总是重复使用表单进行插入和更新。当SKU是与主键不同的属性时,这将变得非常简单。有关代码示例,请参见此模型:
<?php
class Product
{
protected $id;
protected $sku;
protected $name;
// getters & setters here
}
class Form extends \Zend\Form\Form
{
public function __construct()
{
$this->add(array(
'name' => 'sku',
));
$this->add(array(
'name' => 'name',
));
}
}
class Controller extends \Zend\Mvc\Controller\AbstractActionController
{
public function createAction()
{
$form = new Form;
$product = new Product;
$form->bind($product);
if ($this->getRequest()->isPost()) {
$data = $this->getRequest()->getPost();
$form->setData($data);
if ($form->isValid()) {
// get service to update
$service->create($product);
// redirect to view
}
}
return new ViewModel(array(
'form' => $form,
));
}
public function updateAction()
{
$form = new Form;
// Load product based on the ID
$form->bind($product);
if ($this->getRequest()->isPost()) {
$data = $this->getRequest()->getPost();
$form->setData($data);
if ($form->isValid()) {
// get service to update
$service->update($product);
// redirect to view
}
}
return new ViewModel(array(
'form' => $form,
'product' => $product,
));
}
}
谢谢Jurian,是的,我同意,数据库管理应该保留主键。我在本例中尝试使用SKU的唯一原因是因为我的模型(有数千个)是从XML提要定期更新的。通过将SKU作为主键,我可以使用MySql的“重复密钥更新”功能从数千个条目的提要(其中SKU是唯一标识符)非常快速地更新数据库。如果没有这一点,对于每个项目,我首先必须搜索数据库以查看它是否存在,并根据结果决定是否更新。您可以使用INSERT IGNORE
查询,或者在不存在的地方使用INSERT[…]否则。对于第一个(请注意,插入中的所有错误都将被跳过!)您只需在SKU上有一个唯一的约束,然后插入提要中的所有数据。不过,这是一个不同的主题,与上述ZF2问题并不相关。搜索关于这个主题,有很多问题:)