如何显示嵌套关联值 cakephp 3

Posted

技术标签:

【中文标题】如何显示嵌套关联值 cakephp 3【英文标题】:how to show nested association value cakephp 3 【发布时间】:2017-10-11 10:57:03 【问题描述】:

我想运行这段代码,它有嵌套的关联数据:

'VhpProducts.VhpHasilPencapaian',
'Departments.VhpHasilPencapaian',
'Groups.VhpHasilPencapaian' and to sum 'VhpHasilPencapaian.quantity'

但我得到的只是

错误:SQLSTATE[42S22]:未找到列:1054 “字段列表”中的未知列“VhpHasilPencapaian.amount”

$vhpCriteria = $this->VhpCriterias->find('all', [
    'contain' => [
        'VhpProducts.VhpHasilPencapaian',
        'Departments.VhpHasilPencapaian',
        'Groups.VhpHasilPencapaian'
    ],
    'field' => ['VhpProducts.name']
]);
$vhpCriteria->select([
    'product' => 'VhpProducts.name',
    'amountTotal' => $vhpHasilPencapaian->func()->sum('VhpHasilPencapaian.amount'),
    'qty' => $vhpHasilPencapaian->func()->sum('VhpHasilPencapaian.quantity'),
]);

【问题讨论】:

很可能 VhpHasilPencapaian 和/或父关联不是 1:1/n:1,所以它不会出现在主查询中!?您应该提供有关关联的更多信息,以及您正在寻找的结果 SQL 查询。 @ndm 我有与 VhpProduct、部门和组关联(一对多)的 VhpCriterias 表。之后,我的 VhpHasilPencapaian 表也与 VhpProduct、部门和组相关联。所以我想显示来自 VhpHasilPencapaian 的数据并总结它们 【参考方案1】:

“嵌套”关联应该这样写:

    $users = $this
        ->Users
        ->find('all')
        ->contain([
            'Roles' => [
                'Rights'
            ],
            'Posts' => [
                'Comments' => [
                    'Replies' => function($query) 
                        return $query
                            ->where(['public' => 1]);
                    
                ]
            ]
        ])
    ->toArray();

【讨论】:

他们没有,也支持点符号。【参考方案2】:

您需要选择所有要使用的数据。您的字段应该是字段并包括您想要返回的所有字段。或者,您可以完全排除它以返回所有内容。如果您没有在 fields 选项中指定字段,则不会将其返回并且您无法使用它。

$vhpCriteria = $this->VhpCriterias->find('all', [
    'contain' => [
        'VhpProducts.VhpHasilPencapaian',
        'Departments.VhpHasilPencapaian',
        'Groups.VhpHasilPencapaian'
    ],
    'fields' => ['VhpProducts.name', 'ALL OTHER FIELDS']
]);

$vhpCriteria->select([
    'product' => 'VhpProducts.name',
    'amountTotal' => $vhpHasilPencapaian->func()->sum('VhpHasilPencapaian.amount'),
    'qty' => $vhpHasilPencapaian->func()->sum('VhpHasilPencapaian.quantity'),
]);

【讨论】:

这在 SQL 级别上并不重要,在 SQL 查询中,您可以引用表的任何列,无论它是否在 SELECT 列表中,重要的部分是该表实际上包含在查询中。 @ndm 很好。我将不得不进行测试,但我仍然认为 Cakephp 会运行第一个查询,然后运行选择一个,结果几乎就像一个子选择,在这种情况下你需要正确选择它们? CakePHP 确实在 hasManybelongsToMany 关联的情况下运行多个查询,这是正确的,但它们并不相互依赖,除了额外的查询将被提供它们各自“父”查询的主键/绑定键,以及关联查询需要选择各自的外键,以便将结果拼接在一起。此问题中的SUM 函数位于主查询中,因此必须包含VhpHasilPencapaian 表。

以上是关于如何显示嵌套关联值 cakephp 3的主要内容,如果未能解决你的问题,请参考以下文章

CakePHP回调函数如何知道$ q是一个Query对象,哪个表执行查询?

如何将嵌套枚举作为关联值传递但隐藏嵌套枚举的初始化?

在 CakePHP 中保存时如何验证关联模型是不是存在

CakePHP3:如何即时更改关联策略?

CakePHP - 如何在保存时将关联记录添加到模型中?

CakePHP:当有多个关联记录时如何指定返回字段