Php ZF2表格-插入和更新表格

Php ZF2表格-插入和更新表格,php,zend-framework2,Php,Zend Framework2,这更多的是一个方法/最佳实践的问题,而不是一个具体的技术问题,所以我来给你们一些指导 我的问题围绕Zend Framework 2表单,特别是我是否应该为插入实体和更新实体实现不同的表单 概述一个简化的用例。假设我的数据库中有一个product表。每个产品都有一个ID(product\u ID),它是主键和一个名称(name)。假设我存储的产品来自一家供应商,该供应商为我提供了一个唯一的产品id,我想将其用作数据库中的主键 现在,假设我已经实现了一个product\u字段集和一个product\

这更多的是一个方法/最佳实践的问题,而不是一个具体的技术问题,所以我来给你们一些指导

我的问题围绕Zend Framework 2表单,特别是我是否应该为插入实体和更新实体实现不同的表单

概述一个简化的用例。假设我的数据库中有一个product表。每个产品都有一个ID(
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问题并不相关。搜索关于这个主题,有很多问题:)