首页 / PHP / php – Phalcon性能相关查询
php – Phalcon性能相关查询
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了php – Phalcon性能相关查询,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含5435字,纯文字阅读大概需要8分钟。
内容图文
![php – Phalcon性能相关查询](/upload/InfoBanner/zyjiaocheng/809/6bde7a3dfb5f4558b09d781f47f9e150.jpg)
我正在为我创建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运行在这里.
内容总结
以上是互联网集市为您收集整理的php – Phalcon性能相关查询全部内容,希望文章能够帮你解决php – Phalcon性能相关查询所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。