CakePHP如何限制两个表的字段在一个hasMany查询?



我的数据库中有两个表:

processo_administrativohasManydocumento_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());

但是结果是所有的ProcessoAdministrativo没有documenttoprocessoadministrativo例子:

[
(int) 0 => object(AppModelEntityProcessoAdministrativo) {
'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(AppModelEntityProcessoAdministrativo) {
'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(AppModelEntityDocumentoProcessoAdministrativo) {
'id' => (int) 120709,
'descricao' => 'Termo de Abertura',
'ordem' => (int) 0,
'processo_administrativo_id' => (int) 91877,
}
//...

那么,如何使用CakePHP find()来限制两个表的字段呢?

合并hasMany/belongsToMany记录(在单独查询中获得)到结果中发生在PHP级别,因此您必须选择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 (CakeCollectionCollectionInterface $results) {
return $results->map(function ($row) {
unset($row['id']);
return $row;
});
});

相关内容

  • 没有找到相关文章

最新更新