Symfony:从另一个数据库加载表单 EntityType
Symfony: Form EntityType loading from another database
Symfony 4.x 项目使用具有多个数据库连接的学说。
我在一个数据库中有 Customers,在另一个数据库中有 Locations。
我有一个 CustomerForm,我用它来输入和编辑有关客户的信息,包括位置。我需要在 select 列表中构建表单中的位置列表,因此我有一个定义,例如:
<?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
所以看起来它使用的是我的默认数据库连接,而不是包含位置的连接,即使我已经包含了正确的位置 class 和存储库。
如何让这个查询使用正确的连接?
还是有另一种方法来构建此列表?
为 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');
},
])
config/packages/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' 实例而不仅仅是字符串名称。
Symfony 4.x 项目使用具有多个数据库连接的学说。 我在一个数据库中有 Customers,在另一个数据库中有 Locations。 我有一个 CustomerForm,我用它来输入和编辑有关客户的信息,包括位置。我需要在 select 列表中构建表单中的位置列表,因此我有一个定义,例如:
<?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
所以看起来它使用的是我的默认数据库连接,而不是包含位置的连接,即使我已经包含了正确的位置 class 和存储库。
如何让这个查询使用正确的连接?
还是有另一种方法来构建此列表?
为 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');
},
])
config/packages/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' 实例而不仅仅是字符串名称。