2

我正在开发一个电子商务平台,遇到了一个困难。基本上,我在我的场景中有一个产品、选项和选项值。一个产品可能有多个选项,这些选项可能具有多个值。问题是如何以易于创建和编辑的方式存储它。

问题是我直接引用了 OptionValue,它是可变的。我需要保留有关 Option 和 OptionValue 的不可变信息(例如,如果下订单并且颜色为绿色,即使此选项更改为浅绿色,订单也必须保持显示为绿色)。在这种情况下,我需要保存选项的一些属性(例如选项名称 - “颜色”)和每个选项值(每个选项的值 - 例如“红色”)。我认为,它需要一个与现有结构非常相似的结构:一个新的类 ItemOption 引用 Option 和一个 ItemOptionValue 引用 OptionValue。

所以,这是我的尝试:

要创建一个表单来显示我的选项,我有:

class OptionSelectorType extends AbstractType {
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        foreach ($options['product']->getOptions() as $option) {
            $builder->add($option->getId(), 'choice', array('choice_list' => new ObjectChoiceList($option->getValues());));
        }
    }
}

我正在使用 DataTransformer 转换 OrderItemOption 集合中的 OptionValue 集合:

class OrderItemOptionToOptionValueTransformer implements DataTransformerInterface
{ 
    public function transform($lineOptions)
    {
      if(!$lineOptions) {
        return array();
      }
      $values = array();
      foreach($lineOptions as $lineOption) {
        $lineOption->getOption()->getId();
        $values[$id] = array();

        foreach($lineOption->getValues() as $lineOptionValue) {
          $values[$id][] = $lineOptionValue->getOptionValue();
        }
      }

        return $values;
    }

    public function reverseTransform($values)
    {
      $collection = new ArrayCollection();
      foreach($values as $optionId => $optionValues) {
        if(!$optionValues) {
          continue;
        }

        $lineOption = new OrderItemOption();
        $optionValues = is_array($optionValues) ? $optionValues : array($optionValues);
        foreach($optionValues as $optionValue) {
          $lineOptionValue = new OrderItemOptionValue();
          $lineOptionValue->setOptionValue($optionValue);
          $lineOption->addValue($lineOptionValue);
        }

        $lineOption->setOption($optionValue->getOption());
        $collection->add($lineOption);
      }

      return $collection;
    }
}

最后,我的 OrderItemType 表单:

class OrderItemType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
      $builder->add(
        $builder->create('options', 'option_selector', array('options' => $options['options']))
        ->addModelTransformer(new OrderItemOptionToOptionValueTransformer())
      );
    }
}

它有效,但在我看来不是一个好方法,一旦 OptionValue 总是被重新创建,永远不会更新。

你会怎么做?

4

1 回答 1

0

我会保持简单。你可以坚持你的结构,但不要动态地改变事物,而是让它们保持相同的状态。

我是什么意思?

每当创建一个 Option 时,就创建相应的 ItemOption。OptionValue 和 ItemOptionValue 也是如此。两者之间的关系是一对一的连接,而Option和OptionValue不知道连接的ItemOption和ItemOptionValue。

现在,如果 OptionValue 发生变化,您可以查询连接的 ItemOptionValue 并更改您需要更改的内容(取决于内部结构)。

如何存储连接?

使用您已经使用的任何持久性方法。对于数据库,将连接存储在一个表中,如下所示:

CREATE TABLE item_option_to_option (
    optionID INT(10) NOT NULL,
    itemOptionID INT(10) NOT NULL,
    UNIQUE KEY (optionID, itemOptionID)
);

如果可能的话,我会使用外键将两列链接到表中的相应列item_optionoption. 它与 OptionValue 和 ItemOptionValue 相同。

如何处理变化?

每当调用 OptionValue 更改的控制器时,也只需更新 Item* 模型。

如果删除了 Option 或 OptionValue,则取决于您是否也删除了 ItemOption 或 ItemOptionValue。

于 2013-07-27T09:57:27.623 回答