CakePHP 如何在 hasMany 查询中限制两个表的字段?
CakePHP How to limit the fields of both tables in a hasMany query?
我的数据库中有两个表:
processo_administrativo hasMany documento_processo_administrativo
我想检索所有记录,但(出于性能原因)使用 select():
限制字段(列)
所以我尝试了:
<?php
$tablePA = TableRegistry::get('ProcessoAdministrativo');
debug($tablePA->find()
->select('codigo_pa')
->contain(['DocumentoProcessoAdministrativo' =>
fn($q) => $q->select(['id','descricao','ordem','processo_administrativo_id'])
])->toArray());
但结果是 没有 DocumentoProcessoAdministrativo 的所有 ProcessoAdministrativo
示例:
[
(int) 0 => object(App\Model\Entity\ProcessoAdministrativo) {
'codigo_pa' => 'PGE/001.000091/2021',
'documento_processo_administrativo' => []
}
]
我的另一个尝试是使用 enableAutoFields(true),结果是“差不多了”:
<?php
$tablePA = TableRegistry::get('ProcessoAdministrativo');
debug($tablePA->find()
->select('codigo_pa')
->contain(['DocumentoProcessoAdministrativo' =>
fn($q) => $q->select(['id','descricao','ordem','processo_administrativo_id'])
])->toArray());
这一次,我得到了 hasMany 记录(并且只有我定义的字段),但不幸的是,ProcessoAdministrativo 中的所有字段也被检索到了(但我只想要一个字段:codigo_pa):
[
(int) 0 => object(App\Model\Entity\ProcessoAdministrativo) {
'codigo_pa' => 'PGE/001.000091/2021',
'id' => (int) 91877,
'exito_sucumbencia_id' => null,
'especializada_id' => (int) 97,
'classificacao_id' => null,
'materia_id' => null,
//...and much more fields here :(
'documento_processo_administrativo' => [
(int) 0 => object(App\Model\Entity\DocumentoProcessoAdministrativo) {
'id' => (int) 120709,
'descricao' => 'Termo de Abertura',
'ordem' => (int) 0,
'processo_administrativo_id' => (int) 91877,
}
//...
那么,如何使用 CakePHP find() 限制两个表的字段?
将 hasMany
/belongsToMany
记录(在单独的查询中获得)合并到结果中发生在 PHP 级别,因此您必须 select 主键ProcessoAdministrativo
,例如外键约束的另一端,否则 ORM 无法将结果拼接在一起,因为它无法分辨哪个 DocumentoProcessoAdministrativo
记录属于哪个 ProcessoAdministrativo
记录,因为那里会没有可以与 processo_administrativo_id
外键匹配的数据。
$query = $tablePA
->find()
->select(['id', 'codigo_pa'])
->contain([
'DocumentoProcessoAdministrativo' => fn($q) =>
$q->select(['id', 'descricao', 'ordem', 'processo_administrativo_id'])
]);
如果您不想要结果中的 ProcessoAdministrativo.id
字段,则需要在查询记录后将其过滤掉,例如使用结果格式化程序:
$query = $tablePA
->find()
// ...
->formatResults(function (\Cake\Collection\CollectionInterface $results) {
return $results->map(function ($row) {
unset($row['id']);
return $row;
});
});
我的数据库中有两个表:
processo_administrativo hasMany documento_processo_administrativo
我想检索所有记录,但(出于性能原因)使用 select():
限制字段(列)所以我尝试了:
<?php
$tablePA = TableRegistry::get('ProcessoAdministrativo');
debug($tablePA->find()
->select('codigo_pa')
->contain(['DocumentoProcessoAdministrativo' =>
fn($q) => $q->select(['id','descricao','ordem','processo_administrativo_id'])
])->toArray());
但结果是 没有 DocumentoProcessoAdministrativo 的所有 ProcessoAdministrativo 示例:
[
(int) 0 => object(App\Model\Entity\ProcessoAdministrativo) {
'codigo_pa' => 'PGE/001.000091/2021',
'documento_processo_administrativo' => []
}
]
我的另一个尝试是使用 enableAutoFields(true),结果是“差不多了”:
<?php
$tablePA = TableRegistry::get('ProcessoAdministrativo');
debug($tablePA->find()
->select('codigo_pa')
->contain(['DocumentoProcessoAdministrativo' =>
fn($q) => $q->select(['id','descricao','ordem','processo_administrativo_id'])
])->toArray());
这一次,我得到了 hasMany 记录(并且只有我定义的字段),但不幸的是,ProcessoAdministrativo 中的所有字段也被检索到了(但我只想要一个字段:codigo_pa):
[
(int) 0 => object(App\Model\Entity\ProcessoAdministrativo) {
'codigo_pa' => 'PGE/001.000091/2021',
'id' => (int) 91877,
'exito_sucumbencia_id' => null,
'especializada_id' => (int) 97,
'classificacao_id' => null,
'materia_id' => null,
//...and much more fields here :(
'documento_processo_administrativo' => [
(int) 0 => object(App\Model\Entity\DocumentoProcessoAdministrativo) {
'id' => (int) 120709,
'descricao' => 'Termo de Abertura',
'ordem' => (int) 0,
'processo_administrativo_id' => (int) 91877,
}
//...
那么,如何使用 CakePHP find() 限制两个表的字段?
将 hasMany
/belongsToMany
记录(在单独的查询中获得)合并到结果中发生在 PHP 级别,因此您必须 select 主键ProcessoAdministrativo
,例如外键约束的另一端,否则 ORM 无法将结果拼接在一起,因为它无法分辨哪个 DocumentoProcessoAdministrativo
记录属于哪个 ProcessoAdministrativo
记录,因为那里会没有可以与 processo_administrativo_id
外键匹配的数据。
$query = $tablePA
->find()
->select(['id', 'codigo_pa'])
->contain([
'DocumentoProcessoAdministrativo' => fn($q) =>
$q->select(['id', 'descricao', 'ordem', 'processo_administrativo_id'])
]);
如果您不想要结果中的 ProcessoAdministrativo.id
字段,则需要在查询记录后将其过滤掉,例如使用结果格式化程序:
$query = $tablePA
->find()
// ...
->formatResults(function (\Cake\Collection\CollectionInterface $results) {
return $results->map(function ($row) {
unset($row['id']);
return $row;
});
});