Php Phalcon性能相关查询
我正在为端点/项目的输出构建REST API,我创建了两个模型: 项目:Php Phalcon性能相关查询,php,mysql,json,phalcon,Php,Mysql,Json,Phalcon,我正在为端点/项目的输出构建REST API,我创建了两个模型: 项目: class Projects extends BaseModel { public function initialize() { $this->hasMany('id', 'Participants', 'projectId'); } } 与会者: class Participants extends BaseModel { public function init
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->participants在迭代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以相同的方式访问->参与者,您必须将join构建到查询中 代码示例可能类似于:
$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使结果可能是多维的
在PgSQL下测试的这种查询使Phalcon在项目p的ResultSet中创建参与者pi的一些后续ResultSet对象
您仍然可以使用foreach对其进行迭代,但毕竟,我不确定它是否减少了最终查询计数
Fireing$result=$resultSet->toArray使$result['pi']保留为resultSet,因此您应该对此保持谨慎。通过在columns参数中定义精确的列,可以强制将其转储为数组。它有它的缺点-你将不再从groupBy中获利,至少在Phalcon 1.3.2和PHP 5.5.3上,我在这里运行。在Phalcon上有一个很好的库,可以快速加载 该库解决了关系的N+1查询。它已经包含在phalcon培养箱中。我已经在生产中使用它了 它所做的是使用IN子句创建一个查询,并用结果填充模型 在一个国家,它有许多作用:
SELECT * FROM main
SELECT * FROM related WHERE x.id IN (results from the previous resultset)
Phalcon会向您展示创建表和选择吗?如果是,请告诉我们。@RickJames I添加了一个选择查询1的日志,其中project_参与者。project_id=:0-看起来语法不正确-怎么了?2项目参与者有多大?3显示创建表项目参与者;这到底是怎么回事?从信息模式中选择IFCOUNT*>0,1,0。表…?Prolly builder正在收集一些信息,我不知道为什么。项目id=:0的格式与使用PDO的Phalcon相关,并构建包含通配符的PhQL表示。要获得准确的查询,您应该从SQL server本身检索日志,除非您这样做了?。为了避免一次又一次地发送这些信息,您可能需要使用一些元数据缓存,但我不确定这是否会有帮助。