2013-07-10 49 views
0

这是更接近/最佳实践的问题,不是一个具体的技术问题,所以我来找你的一些指导。ZF2形式 - 插入和更新形成

我的问题围绕着Zend框架2点的形式,特别是如果我要实现对insetting实体和更新的实体不同的形式。

概述一个简化的用例。比方说,我在我的数据库中有一个产品表。每个产品都有一个ID(product_id),它是主键和名称(name)。假设我存储的产品来自供应商,他们向我提供了一个我想用于数据库中主键的唯一产品ID。

现在,假设我已经实施了一个product_fieldset和一个product_form,两者都很好地工作。该表格允许我指定产品ID和名称并将其存储在数据库中。但是,当用户使用表单更新产品名称而不是插入新产品时,我不希望他们能够编辑产品ID,因为这是我的数据库主键。

我目前只能看到如何我可以通过实施2点的形式和2个字段集少一个字段(产品ID)呈现形式在更新场景。

你会如何处理这个问题?当使用服务经理/表单管理员撤回我的表单时,我无法理解我在表格中如何/在哪里或哪些地方应用逻辑来处理这些情况。

:WQ

回答

1

首先:

比方说,我是来自供应商的存储产品谁给我提供了一个独特的产品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, 
    )); 
    } 
} 

这意味着该模型始终保持一个ID“为自己”和SKU可以随时进行更新。更新使用请求中的ID(例如,您的网址为admin/product/edit/123),并且SKU编号有所不同,并且可以更新。

通过这种方式,形式可以保持相同的更新和创建方法两者。我通常使用服务层来坚持对象,你应该按照你喜欢的方式去做。

+0

感谢Jurian,并且我同意,主键应该保留用于数据库管理。在这种情况下,我尝试使用SKU的唯一原因是因为我的模型(并且有成千上万个)定期从XML源更新。通过将SKU作为主键,我可以使用MySql的“ON DUPLICATE KEY UPDATE”功能,从SKU为唯一标识符的数千个项目的源中快速更新数据库。如果没有这个,对于每个项目,我首先必须搜索数据库,看它是否存在,并根据结果做出更新决定。 – familymangreg

+0

您可以使用'INSERT IGNORE'查询或使用'INSERT [WHERE NOT EXISTS ]',否则。对于第一个(插入中的所有错误将被跳过,请注意!)您只需对SKU有一个唯一的限制,然后插入您的Feed中的所有数据。虽然,这是一个不同的话题,并没有真正涉及到上述ZF2问题。搜索关于这个话题,有很多关于它的问题:) –