当前位置: 首页 > 知识库问答 >
问题:

创建复杂查询的Symfony原则

郎鸿雪
2023-03-14

我有一个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个答案

公冶龙野
2023-03-14

您的查询没有连接,因此我不确定您在这里想要实现什么,但是如果您只想在db1.table1db2.table1中查找所有实体,那么这些应该是两个单独的查询。

同样,在Doctrine中,很难使用多个数据库,所以除非你有充分的理由,否则我建议你将两个表移动到同一个数据库,并将db2.table1重命名为db1.table2...

在此之后,Table1Repository中的QueryBuilder将在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();
}

以及表2repository中的QueryBuilder:

public function findByNameLike($name) {
        $qb = $this->createQueryBuilder('table2')
            ->where('table2.name LIKE :name')
            ->setParameter('name', addcslashes($name, '_%')
            ->getQuery()
            ->execute();
}

addcslashes调用被添加到转义%-这些字符在中被视为特殊字符,如说明符

袁霍英
2023-03-14

首先,您需要为第一个数据库和第二个数据库配置两个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

请注意,这里我们在dbname中为db2连接使用参数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 ...')

请注意,这不是最佳做法。最佳实践是为表创建实体,然后沿着我在上面创建的连接创建单独的实体管理器。

如何正确设置与实体管理器的多个连接

 类似资料:
  • 问题内容: 我有4个不同的表: table_price_product(包含与产品及其价格有关的信息) table_price_list(包含与价目表相关的信息) prices_per_client(包含与给定特定产品的不同客户的价格相关的信息) 客户(包含与客户相关的信息) 这是我的SQL FIDDLE:LINK 我懂了: 现在,我想在一个查询中获得与产品和客户有关的所有数据,分别用CLASS

  • 我正在努力为visual composer进行两个自定义查询: > 一个查询,它将以升序或降序(以最先显示即将到来的事件的为准)显示发布日期在今天之后的帖子(有发布未来帖子的插件) 仅显示满足多个类别要求的帖子的查询(例如,“即将发布”和“类别”或“即将发布”和“社交”类别) 真的,这两种方法中的任何一种都可以得到我想要的结果,但是第一种方法是最方便的。 在我的一生中,我无法在自定义查询中破译Co

  • 我有这个: 如何从hashlist中排除“item”?打破了我的头。Linq不想对我开放。

  • 如何使用在中创建复杂查询请求?我担心实体之间的关系。它们可能会影响请求的准备。 需要查询SQL,我的版本@Query:

  • 问题内容: 我正在尝试查询Google BigQuery公共Reddit数据集。我的目标是使用Jaccards’Index来计算子reddit的相似性,该索引的定义如下: 我的计划是在2016年8月按评论数选择前N = 1000个子项,然后计算其笛卡尔积,以得到形状中所有子项的组合。 然后使用这些组合的行来查询subreddit1和subreddit 2之间的用户并集以及交集。 我到目前为止的查询

  • 问题内容: 表Words_Learned包含用户已知的所有单词以及 单词学习的顺序。它具有3列:1)单词ID和2)用户ID,以及3) 单词学习的顺序。 表中Article包含文章。它具有3列:1)文章ID,2) 唯一字数和3)文章内容。 该表Words包含每篇文章中包含的所有唯一单词的列表。 它有2列1)单词ID和2)文章ID 数据库图如下/ 在此处输入图片说明 您可以从此处下载数据库代码:htt