0

我正在尝试为这三个实例创建一个嵌套表单,其中库存具有默认数据,并且嵌套表单InventoryProduct在表单中默认包含数据库中的所有产品。

  • Inventory(有一个或多个InventarioProduct) - Id, StartDate,EndDate
  • InventoryProduct- Id, Product, Units, RejectedUnits,QuarantineUnits
  • Product- Id, Name, Inci, 来自产品的其他一些数据

所以我们添加InventoryCrudCrontrollercreateEntityMethod

public function createEntity(string $entityFqcn)
    {
        $inventory= new Inventory();
        $inventory->setStartDate(new DateTime('now'));
        $inventory->setEndDate(null);

        $productRepository= $this->entityManager->getRepository(MateriaPrima::class);

        $products= $productRepository->findAll();

        foreach ($products as $product) {
            $inventoryProduct= new InventoryProduct();
            $inventoryProduct->setProduct($product);
            $inventoryProduct->setUnits(0);
            $inventoryProduct->setUnitsRejected(0);
            $inventoryProduct->setUnitsQuarantine(0);
            $inventoryProduct->setInventory($inventory);

            $inventory->addInventarioProduct($inventoryProduct);
        }

configureFields方法上InventoryCrudCrontroller

public function configureFields(string $pageName): iterable
    {

        if (Crud::PAGE_EDIT === $pageName || Crud::PAGE_NEW == $pageName) {
            return [
                DateTimeField::new('startDate')
                    ->setColumns(6)
                    ->setValue(new DateTime()),
                DateTimeField::new('endDate')
                    ->setColumns(6),
                CollectionField::new('products', 'Products:')
                    ->onlyOnForms()
                    ->allowAdd()
                    ->allowDelete()
                    ->setEntryIsComplex(false)
                    ->setEntryType(InventoryProductType::class)
                    ->renderExpanded(true)
                    ->setFormTypeOptions(
                        [
                            'by_reference' => false,
                        ]
                    )
                    ->setColumns(12),

我们InventoryProductType为海关表格添加类:

class InventoryProducts extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options): void
    {

        $builder
            ->add(
                'product',
                EntityType::class,
                ['class' => Product::class, 'label' => '-']
            )
            ->add('units')
            ->add('unitsRejected')
            ->add('unitsQuarantine')
            ;
    }

    public function configureOptions(OptionsResolver $resolver): void
    {
        $resolver->setDefaults([
            'data_class' => InventoryProduct::class,
        ]);
    }
}


当我们尝试添加另一个注册表时,我们得到:

必须管理传递给选择字段的“App\Entity\Inventory”类型的实体。也许您忘记将其保留在实体管理器中?

我究竟做错了什么?

谢谢你的帮助!!

4

1 回答 1

1

该错误告诉您您正在使用App\Entity\Inventory不受实体管理器管理的类型的实体。

如果您查看您的代码,您将在您的createEntity方法中创建一个新实体,但从未持久化它。

您可以将其保留在您的方法中,例如:

public function createEntity(string $entityFqcn)
    {
        $inventory= new Inventory();
        $inventory->setStartDate(new DateTime('now'));
        $inventory->setEndDate(null);
        $this->entityManager->persist($inventory);

        $productRepository= $this->entityManager->getRepository(MateriaPrima::class);

        $products= $productRepository->findAll();
        
        foreach ($products as $product) {
            $inventoryProduct= new InventoryProduct();
            $inventoryProduct->setProduct($product);
            $inventoryProduct->setUnits(0);
            $inventoryProduct->setUnitsRejected(0);
            $inventoryProduct->setUnitsQuarantine(0);
            $inventoryProduct->setInventory($inventory);
            $this->entityManager->persist($inventoryProduct);

            $inventory->addInventarioProduct($inventoryProduct);
        }
    }

或者在您的实体上添加级联持久性。

于 2021-11-29T14:23:19.757 回答