Symfony:从另一个数据库加载Form EntityType

时间:2018-04-20 22:37:18

标签: forms symfony doctrine symfony4

使用具有多个数据库连接的学说的Symfony 4.x项目。 我在一个数据库中有客户,在另一个数据库中有位置。 我有 CustomerForm ,用于输入和编辑有关客户的信息,包括位置信息。我需要在选择列表中构建表单中的位置列表,所以我有一个定义,如:

<?php

namespace App\Form;

use App\Entity\Lobbytrack\Location;
use App\Repository\Lobbytrack\LocationRepository;
use Doctrine\ORM\EntityRepository;

class CustomerForm extends AbstractType
{
    /**
     * {@inheritdoc}
     */
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
         ...

          $builder
            ->add('location', EntityType::class, [
                'label' => 'Location',
                'class' => Location::class,
                'query_builder' => function (EntityRepository $er) {
                    return $er->createQueryBuilder('l')
                        ->where('l.isActive = 1')
                        ->orderBy('l.order',' ASC');
                },
            ])

          ...
}

/**
 * {@inheritdoc}
 */
public function configureOptions(OptionsResolver $resolver)
{
    $resolver->setDefaults(array(
        'data_class' => 'App\Entity\Customer'
    ));
}

当我尝试加载表单时,会抛出错误:

SQLSTATE[42S02]: Base table or view not found: 1146 Table 'smc.location' doesn't exist

所以看起来它正在使用我的默认数据库连接,而不是包含位置的连接,即使我已经包含了正确的Location类和Repository。

如何让此查询使用正确的连接?
或者是否有其他方法来构建此列表?

1 个答案:

答案 0 :(得分:1)

指定formBuilder的'em'选项:

          $builder
        ->add('location', EntityType::class, [
            'label' => 'Location',
            'class' => Location::class,
            'em'  => 'custom_1'
            'query_builder' => function (EntityRepository $er) {
                return $er->createQueryBuilder('l')
                    ->where('l.isActive = 1')
                    ->orderBy('l.order',' ASC');
            },
        ])

配置/包/ doctrine.yaml:

    dbal:
 #        url: '%env(DATABASE_URL)%'
        default_connection: default
        connections:
            default:
                driver: pdo_pgsql
                driver_class: App\Doctrine\DBAL\Driver\CustomPostgreSQLDriver
                host: '%env(DATABASE_HOST)%' 
                port: '%env(DATABASE_PORT)%' 
                dbname: '%env(DATABASE_NAME)%' 
                user: '%env(DATABASE_USER)%' 
                password: '%env(DATABASE_PASSWORD)%' 
                charset: UTF8
            custom_1:
                driver: pdo_pgsql
                ...

另一种选择是提供'em'实例,而不仅仅是字符串名称。