我有一个mysql查询并且它并不是很复杂,但我似乎无法理解我应该如何在Symfony中编写它。
首先是查询:
select
db1.table1.acronym
, db1.table1.name
, db2.table1.name
from db1.table1, db2.table1
where db1.table1.acronym like concat('%', @t1, '%')
or db1.table1.name like concat('%', @t1,'%')
or db2.table1.name like concat('%', @t1,'%');
我基本上试图看看t1是否是这些列中任何单词的一部分。假设@t1
是传递的变量。我不确定我是否应该在存储库中写这个,如果是这样的话。我正在寻找最佳实践方法。
感谢。
答案 0 :(得分:1)
首先,您需要为第一个数据库和第二个数据库配置两个Doctrine DB连接。它看起来像这样(我假设你还没有为表创建实体):
//in config.yml
doctrine:
dbal:
default_connection: db1
connections:
db1:
driver: "%database_driver%"
host: "%database_host%"
port: "%database_port%"
dbname: "%database_name%"
user: "%database_user%"
password: "%database_password%"
charset: UTF8
db2:
driver: "%database_driver%"
host: "%database_host%"
port: "%database_port%"
dbname: "%database_name2%"
user: "%database_user%"
password: "%database_password%"
charset: UTF8
请注意,我们在db3连接的'dbname'中使用参数database_name2,其他参数很可能是相同的,除非你在另一台服务器上有另一个数据库,所以你应该在parameters.yml中相应地创建参数。
然后,您可以连接到单独的数据库,例如,控制器操作,如下所示:
//SomeController.php
$connection1 = $this->getDoctrine()->getConnection('db1');
$connection2 = $this->getDoctrine()->getConnection('db2');
$results1 = $connection1->fetchAll('SELECT acronym, name FROM table1 ...');
$results2 = $connection2->fetchAll('SELECT name FROM table2 ...')
注意,这不是最佳做法。最佳实践是为表创建实体,然后沿着我在上面创建的连接创建单独的实体管理器。
How to properly setup multiple connections with entity managers
答案 1 :(得分:0)
您的查询没有加入,因此我不确定您在此处尝试实现的目标,但如果您只想查找db1.table1
中的所有实体, db2.table1
,这些应该是2个单独的查询。
同样使用Doctrine,很难使用多个数据库,所以除非你有充足的理由,否则我建议你将两个表移动到同一个数据库并将db2.table1
重命名为{{1} }。
在此之后,db1.table2
中的QueryBuilder在Table1Repository
中查找实体会是这样的:
table1
public function findByNameOrAcronymLike($nameOrAcronym) {
$qb = $this->createQueryBuilder('table1')
->where('table1.acronym LIKE :t1')
->or('table1.name LIKE :nameOrAcronym')
->setParameter('nameOrAcronym', addcslashes($nameOrAcronym, '_%'))
->getQuery()
->execute();
}
中的QueryBuilder:
Table2Repository
public function findByNameLike($name) {
$qb = $this->createQueryBuilder('table2')
->where('table2.name LIKE :name')
->setParameter('name', addcslashes($name, '_%')
->getQuery()
->execute();
}
调用已添加到转义addcslashes
和%
- 这些被视为_
说明符中的特殊字符