Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php Phalcon性能相关查询_Php_Mysql_Json_Phalcon - Fatal编程技术网

Php Phalcon性能相关查询

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

我正在为端点/项目的输出构建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->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本身检索日志,除非您这样做了?。为了避免一次又一次地发送这些信息,您可能需要使用一些元数据缓存,但我不确定这是否会有帮助。