Symfony2表格类型实体无预加载



我正在建造一个带有> 40k产品的网络商店。这些产品存储在MySQL表中(生成了表格2个控制台和学说2)。

我有一个采购订单系统并创建了一个表格。

[table public_orders]

[table public_order_rows](fk paskure_order_id和fk product_id)

[表产品](产品(RAM模块,很多属性)(FK Brand_ID)

[table product_brands]

paskureordertype.php

public function buildForm(FormBuilderInterface $builder, array $options)
{
    $builder
        ->add('customer', 'entity', array(
            'class' => 'MyShopBundleCustomerBundleEntityCustomer',
            'multiple' => false
        ))
        ->add('purchaseOrderStatus', 'entity', array(
            'class' => 'AppBundleEntityPurchaseOrderStatus',
            'multiple' => false
        ))
        ->add('date')
        ->add('reference')
        ->add('comments')
        ->add('purchaseOrderRows', 'collection', [
            'type' => new PurchaseOrderRowType(),
            'allow_add' => true,
            'by_reference' => false,
        ])
    ;
}

paskureordorrowtype

public function buildForm(FormBuilderInterface $builder, array $options)
{
    $builder
        ->add('purchaseOrder', 'entity', array(
            'class' => 'AppBundleBundleOrderBundleEntityPurchaseOrder',
            'multiple' => false
        ))
        ->add('ram', 'entity', array(
            'class' => 'MyShopBundleProductBundleEntityRam',
            'multiple' => false,
        ))
        ->add('purchaseOrderRowStatus', 'entity', array(
            'class' => 'AppBundleEntityPurchaseOrderRowStatus',
            'multiple' => false
        ))
        ->add('description')
        ->add('count')
        ->add('startDate')
        ->add('endDate')
        ->add('amount')
        ->add('taxAmount')
        ->add('discountAmount')
    ;
}

当我使用学说生成表单时,它会从产品表中加载所有行,从而导致非常缓慢/不可负载的网页。我如何不预先加载所有这些产品?每种产品都有一个唯一的条形码,用户和数据库已知。用户只需要输入条形码,而不是从下拉列表中选择产品。

我一直在尝试将键query_builder添加到 -> add('ram','实体',但这并没有导致解决方案,我被卡住了...

还添加新的采购订单费用超过30秒!我怀疑这个问题也导致了这一点。

任何帮助都将不胜感激。

我可以看到的一种解决方案是创建一个DataTransformer,该dataTransFormer将条形码转换为产品实体和V.V.这是您几乎可以更改并使用它的几乎准备好的示例,您可以选择地将一些jQuery插件(例如自动完成)添加到该TextField。

我们也有类似的问题,这是我们提出的解决方案:

您应该考虑创建最终类 productforchoice,EntityManager作为依赖项,单个 Invoke 方法:

/**
* Class ProductForChoice
*/
final class ProductForChoice 
{
    /** @var EntityManager */
    protected $entityManager;
    function __construct(EntityManager $entityManager)
    {
        $this->entityManager = $entityManager;
    }
    public function invoke()
    {
        $dql = "
            SELECT product.id, product.barCode as bar_code
            FROM Entity/Product as product
        ";
        $query = $this->entityManager->createQuery($dql);
        $results =  $query->useResultCache(true, 300)->getArrayResult();
        $ret = [];
        foreach ($results as $result) {
            $ret[$result['id']] = $result['bar_code'];
        }
        return $ret;
    }
}

然后在确保将此类注册为服务之后,您可以以这种方式在抽象类型中使用它:

 ->add('product', 'filter_choice', [
            'required' => false,
            'choices' => $this->ProductForChoiceAsService->invoke(),
            'label' => 'Products',
        ]);

请注意,在此示例中,存在 filter_choice ,而不是 Entity

作为附带说明,如果要保留抽象类型,依赖性 - 清洁您可能需要通过 product forforchoiceasservice 在表单选项中,而不是使用__constructor,您的呼叫。


更多地帮助用户在任务中考虑采用选择,这是将多选为搜索输入箱变成类似搜索的输入箱的非常汉字的工具。

希望它有帮助,问候。

相关内容

  • 没有找到相关文章

最新更新