Symfony Doctrine创建复杂查询

时间:2015-08-07 21:56:07

标签: mysql symfony doctrine-orm

我有一个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是传递的变量。我不确定我是否应该在存储库中写这个,如果是这样的话。我正在寻找最佳实践方法。

感谢。

2 个答案:

答案 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% - 这些被视为_说明符中的特殊字符