【问题标题】:Symfony CollectionType regards deletion+creation as a modification of an itemSymfony CollectionType 将删除+创建视为对项的修改
【发布时间】:2016-07-12 15:41:10
【问题描述】:

我有一个 Symfony OrderType 表单附加到一个 Order 对象。这个Order 对象有一个items 属性,其中包含OrderItem 对象的ArrayCollection。这些OrderItem 对象每个都包含product 和quantity 属性。 product 属性链接到 Product 对象。每个OrderItem 都与一个OrderItemType 相关联,该CollectionType 是与Order items 属性相关联的一部分。

长话短说,这里是代码(非常简化,具有最少的属性,没有教义注释):

请注意,基本上一切正常,我不是在寻找这段代码中的错误:)

订单类

class Order {
    private $id;
    private $items;// ArrayCollection of OrderItem
}

订单商品类

class OrderItem {
    private $id;
    private $product;// Product object
    private $quantity;// int
}

订购单

class OrderType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('items', CollectionType::class, array(
                'by_reference' => false,
                'entry_type'   => OrderItemType::class,
                'allow_add' => true,
                'allow_delete' => true
            ));
    }
}

订单商品表单

class OrderItemType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('product', EntityType::class, array(
                'class' => 'AppBundle\Entity\Product',
                'choice_label' => 'id'
            ))
            ->add('quantity', NumberType::class)
    }
}

当然,用户可以按创建、编辑和删除行的顺序添加和删除行。嗯,差不多……

如果我删除订单的最后一行并创建一个新行,Symfony 认为新行实际上是对旧行的修改。当然,Symfony 没有办法知道这条线不是旧的。

所以我在OrderItemType 中添加了一个id 字段。但是当然,Symfony 不能在提交时设置id,因为OrderItem 中没有setId 方法(这很正常,因为手动设置对象的id 是个坏主意)。

这就是我卡住的地方。我想我可以将id 字段设置为mapped: false 并在控制器上实现自定义逻辑,以摆脱在其id 未出现在发布的值中时被删除的旧项目并创建一个新的OrderItem对于具有空 id 的项目,但这对我来说似乎是丑陋的黑客行为,我想知道我是否没有完全遗漏一些东西,因为这看起来像是一个非常基本的问题。

那么 Symfony 是否有一种内置方法来识别 CollectionType 表单中 deletion+creation 和 edition 之间的区别?我完全错过了什么吗?蛋糕是骗人的吗?

编辑

我知道我的代码不完整,但我想专注于手头的问题。换一种说法:

  1. 用户在订单中为需要 3 个产品 A 和 2 个产品 B 的客户创建了两行。
  2. 用户保存订单(Symfony 在数据库中创建 ID 为 1 和 2 的 2 个OrderItem 对象)
  3. 客户再次调用,想要 5 个 productC 而不是 2 个 productB。
  4. 用户删除第 2 行 (2 productB) 并添加新行 (5 productC)。

在这里,Symfony 通过分配新产品 (productC) 和数量 (5) 来更改 ID #2 的 OrderItem。但我希望 Symfony 删除 OrderItem #2 并创建一个 ID 为 3 的新 OrderItem。

我希望这更清楚一点。

【问题讨论】:

  • 注意:你有private $quantity;// float,但数量“不能”是浮点数!!!
  • 好的,现在是int。我可以将其设为string 或array,这不会改变我的问题,对吗?
  • 这是旧的,但谷歌把我带到了这里;也可以帮助其他人。解决方案是索引关联,见stackoverflow.com/questions/64775433/…

标签: php forms doctrine-orm symfony


【解决方案1】:

我知道您尚未添加 Doctrine 注释,但这与您描述的 Id 问题有关。通常你会自动生成一个 ID,所以没有“setter”,但有一个“getter”。

所以你会有这样的东西:

class OrderItem {
...
    /**
     * @ORM\Id
     * @ORM\Column(name="order_item_id", type="integer")
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    protected $order_item_id;

是的,您的 $quantity 值应该是“int”,但这并不重要。我只是让你知道你不能有一半的数量。

【讨论】:

  • 对不起,这与它无关。我的代码有数千行,并且已经运行了 4 个月(除了我的问题中的问题)。我刚刚写了这个非常简化版本来配合这个问题。添加id 字段似乎是对CollectionType 字段的错误使用。
  • 你没有展示足够多的代码让任何人给出一个好的答案。您可能想重新发布一个经过深思熟虑的不同问题。我只是想帮你。此外,如果您的代码有数千行,那么它似乎不符合 Symfony MVC 最佳实践。
  • 对不起,我有点走神了。我在编辑我的问题时重新解释了我的问题。我希望这能更好地解释它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多