当前位置: 首页 > 面试题库 >

Phalcon性能相关查询

麻书
2023-03-14
问题内容

我正在为创建的2个模型的终结点/项目的输出构建REST API:

项目:

class Projects extends BaseModel
{
    public function initialize()
    {
        $this->hasMany('id', 'Participants', 'projectId');
    }
}

参加者:

class Participants extends BaseModel
{
    public function initialize()
    {
        $this->belongsTo('projectId', 'Projects', 'id');
    }
}

可以说,我有10个项目:(1个查询)

$results = Projects::find();

我遍历了所有10个人,但我也希望所有参与者:

foreach($results as $result) {
    echo $result->participants; // 1 query
}

因此,在循环结束时,Phalcon对每个项目进行了额外的查询。

这些查询是通过访问$ result->参与者进行的,同时迭代了10个项目:

SELECT IF(COUNT(*)>0, 1 , 0) FROM `INFORMATION_SCHEMA`.`TABLES` WHERE `TABLE_NAME`='projects'
DESCRIBE `projects`
SELECT `projects`.`id`, `projects`.`title`, `projects`.`client`, `projects`.`color`, `projects`.`start_date`, `projects`.`end_date`, `projects`.`notes`, `projects`.`stateId`, `projects`.`created_at`, `projects`.`updated_at` FROM `projects`
SELECT IF(COUNT(*)>0, 1 , 0) FROM `INFORMATION_SCHEMA`.`TABLES` WHERE `TABLE_NAME`='project_participants'
DESCRIBE `project_participants`
SELECT `project_participants`.`id`, `project_participants`.`project_id`, `project_participants`.`user_id`, `project_participants`.`user_role_id`, `project_participants`.`user_state_id`, `project_participants`.`updated_at`, `project_participants`.`created_at` FROM `project_participants` WHERE `project_participants`.`project_id` = :0
SELECT `project_participants`.`id`, `project_participants`.`project_id`, `project_participants`.`user_id`, `project_participants`.`user_role_id`, `project_participants`.`user_state_id`, `project_participants`.`updated_at`, `project_participants`.`created_at` FROM `project_participants` WHERE `project_participants`.`project_id` = :0
SELECT `project_participants`.`id`, `project_participants`.`project_id`, `project_participants`.`user_id`, `project_participants`.`user_role_id`, `project_participants`.`user_state_id`, `project_participants`.`updated_at`, `project_participants`.`created_at` FROM `project_participants` WHERE `project_participants`.`project_id` = :0
SELECT `project_participants`.`id`, `project_participants`.`project_id`, `project_participants`.`user_id`, `project_participants`.`user_role_id`, `project_participants`.`user_state_id`, `project_participants`.`updated_at`, `project_participants`.`created_at` FROM `project_participants` WHERE `project_participants`.`project_id` = :0
SELECT `project_participants`.`id`, `project_participants`.`project_id`, `project_participants`.`user_id`, `project_participants`.`user_role_id`, `project_participants`.`user_state_id`, `project_participants`.`updated_at`, `project_participants`.`created_at` FROM `project_participants` WHERE `project_participants`.`project_id` = :0
SELECT `project_participants`.`id`, `project_participants`.`project_id`, `project_participants`.`user_id`, `project_participants`.`user_role_id`, `project_participants`.`user_state_id`, `project_participants`.`updated_at`, `project_participants`.`created_at` FROM `project_participants` WHERE `project_participants`.`project_id` = :0
SELECT `project_participants`.`id`, `project_participants`.`project_id`, `project_participants`.`user_id`, `project_participants`.`user_role_id`, `project_participants`.`user_state_id`, `project_participants`.`updated_at`, `project_participants`.`created_at` FROM `project_participants` WHERE `project_participants`.`project_id` = :0
SELECT `project_participants`.`id`, `project_participants`.`project_id`, `project_participants`.`user_id`, `project_participants`.`user_role_id`, `project_participants`.`user_state_id`, `project_participants`.`updated_at`, `project_participants`.`created_at` FROM `project_participants` WHERE `project_participants`.`project_id` = :0
SELECT `project_participants`.`id`, `project_participants`.`project_id`, `project_participants`.`user_id`, `project_participants`.`user_role_id`, `project_participants`.`user_state_id`, `project_participants`.`updated_at`, `project_participants`.`created_at` FROM `project_participants` WHERE `project_participants`.`project_id` = :0

有没有一种方法可以事先查询关系,因此将是一个查询。 当我使用Phalcon提供的查询生成器时,我无法以相同的方式访问->参与者。

编辑

我最终使用查询生成器,对所有列进行命名

$builder = $modelsManager->createBuilder();
$builder->columns($columns)
        ->from('Projects')
        ->leftJoin('Participants')
        ->getQuery()
        ->execute();

像这样的列:

Projects.id as projects_id
...
Participants.id as participants_id
Participants.projectId as participants_projectId

因为访问->参与者对查询生成器创建的结果,所以也做了额外的查询。


问题答案:

要使用QueryBuilder以相同的方式访问->参与者,您将必须在Query中建立联接。

代码示例可能类似于:

$queryBuilder = $this->getDI()->getModelsManager()
    ->createBuilder()
    ->columns(['p.id','participants.*'])
    ->addFrom('Entity\Projects', 'p')
    ->leftJoin('Entity\Participants', 'participants.projectId = p.id', 'participants')
    ->groupBy('p.id, participants.id')
    ->orderBy('p.id ASC');

$resultSet = $queryBuilder->getQuery()->execute();

groupBy() 这里使用by来使结果可能是多维的。

这种查询(在PgSQL下进行了测试)使Phalcon pi在项目的Resultsset中创建了参与者的一些后续ResultSet对象p

您仍然可以使用进行遍历foreach()但毕竟 我不确定它是否减少了最终查询数

进行的射击仍保留为Resultset,因此您应$result = $resultSet->toArray()对此$result['pi']保持谨慎。
您可以通过在columns()参数中定义确切的列来强制将其转储为数组。它有其缺点- groupBy()至少在这里运行的Phalcon
1.3.2和PHP 5.5.3 im上,您将不再从中受益。



 类似资料:
  • Phalcon 是开源的完整堆栈框架作为 PHP 的 C 扩展提供,提供高性能和低资源占用。 Phalcon针对高性能进行了优化。 其独特的体系结构允许框架始终驻留在内存中,在需要时提供其功能,而无需昂贵的文件统计信息和传统PHP框架使用的文件读取。考虑到平台独立性。 因此,Phalcon可在Microsoft Windows,GNU / Linux,FreeBSD和MacOS上使用。 您可以为您

  • PhalconDebugbar 这个扩展包将 PHP Debug Bar 与  Phalcon FrameWork 集成在了一起. 要感谢 laravel-debugbar, 我从中得到了启发, 使用了其中的一些代码, 经过几天夜以继日的工作, PhpDebugbar 终于可以用在Phalcon项目上了! 我在 Mac/PHP5.6/Phalcon 1.3.4 之下开发, 时间关系, 只在PHP5

  • 我正在寻找一种方法来声明“2个依赖项之间的依赖项”。 例如,在我的模块中,我ivy.xml以下行: 我的问题是,日志经典 1.0.13 依赖于 slf4j-api 1.7.5,而我的模块依赖于 1.6.6(slf4japiversion 的值)。 我无法更改 slf4japiversion,但将来它可以由其他人升级。 有没有办法声明对logback的依赖关系,以检索与我的slf4j api版本兼容

  • 前言:uView在1.x版本,只有部分组件支持nvue,不推荐在nvue项目中使用,目前uView研发组正在研发2.0版本,将会全面兼容nvue,我们在这里做一个专题,列出一些nvue上的坑,希望能帮助到您。 Text组件 我们在vue中,可以将文本相关的内容放到view或者text组件,这都是没问题的,但是在nvue中,需要动态响应(双向绑定)的内容,必须放在text标签,如果放在view可以正

  • 我是XSD和XML新手,需要了解是否有选项来确保同一元素中一组属性中的任何一个属性都是必需的。 示例: 在这里,我想确保在一组3个属性(上面提到的可选)中,至少有一个属性是必需的。所有都不能是可选的,但是任何一个(也可以是多个)都是必需的。 谢谢,Rajneesh

  • 问题内容: 每次执行此查询需要200毫秒以上的时间: 但这每次在第一次查询后每次执行只需要2-3毫秒: 注意在两个查询中相同的ID值。看起来第二个查询使用第一个查询的缓存结果。但是,为什么第一个查询不能使用缓存的结果本身?从第一个查询中删除不会更改任何内容。 当我使用其他ID执行第二个查询时,第一次执行该查询大约需要40毫秒,此后每次需要2-3毫秒。因此,第二个查询不仅运行速度更快,而且还缓存结果