繁体   English   中英

Phalcon性能相关查询

[英]Phalcon performance related queries

我正在为我创建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为每个项目进行了额外的查询。

这些查询是通过在迭代10个项目时访问$ result->参与者来完成的:

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提供的查询生成器时,我无法以相同的方式访问 - >参与者。

编辑

我最终使用了Query Builder,命名所有列

$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在项目p Resultsets中为参与者pi创建了一些后续的ResultSet对象。

您仍然可以使用foreach()迭代它,但毕竟, 我不确定它是否确实减少了最终查询计数

Fireing $result = $resultSet->toArray()使得$result['pi']保留为Resultset,所以你应该保持谨慎。 您可以通过在columns()参数中定义精确列来强制它作为数组转储。 它有它的缺点 - 你将不再从groupBy() ,至少在Phalcon 1.3.2和PHP 5.5.3 im运行在这里。

有一个很棒的图书馆,可以快速加载phalcon。

stibiumz phalcon渴望加载

该库解决了N + 1查询关系。 它已经包含在phalcon孵化器中。 我已经在生产中使用它了。

它的作用是使用IN子句创建查询并使用结果填充模型。

它有很多它做的:

SELECT * FROM main
SELECT * FROM related WHERE x.id IN (results from the previous resultset)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM