【问题标题】:cakephp 3 unable to sort by deeply associated datacakephp 3 无法按深度关联的数据排序
【发布时间】:2017-08-15 20:38:58
【问题描述】:

我们无法通过深度关联的数据对交易进行排序。主要是 belongsTo 和 hasOne 关联。任何需要/未在此处建立的信息将立即发布。表格:

BcTransactions:

$this->belongsTo('Seller', [
    'className' => 'BcAccessCards',
    'foreignKey' => 'seller',
    'propertyName' => 'BcAccessCards',
]);
$this->belongsTo('Buyer', [
    'className' => 'BcUsers',
    'foreignKey' => 'buyer',
    'propertyName' => 'BcUsers',
]);

BcAccessCards:

$this->belongsTo('BcUsers', [
    'className' => 'BcUsers',
    'foreignKey' => 'user',
    'propertyName' => 'BcUsers'
]);

Bc用户:

$this->hasOne('BcUserInfos', [
    'className' => 'BcUserInfos',
    'foreignKey' => 'user_id',
    'dependent' => true,
    'propertyName' => 'BcUserInfos'
]);

我们能够检索每笔交易的所有相关数据:

$query = $bcTransactions->find('all', [
    'conditions' => ['BcTransactions.company =' => $id],
    'contain' => ['Seller', 'Seller.BcUsers', 'Seller.BcUsers.BcUserInfos', 'Buyer', 'Buyer.BcUserInfos'],
]);

查询返回完美的数据集,但在排序方面:

$this->paginate = [
    'contain' => ['Seller', 'Seller.BcUsers', 'Seller.BcUsers.BcUserInfos', 'Buyer', 'Buyer.BcUserInfos'],
    'sortWhitelist' => [
        'id',
        'Buyer.BcUserInfos.firstname',
        'Seller.BcUsers.BcUserInfos.firstname',
    ]
];
$this->paginate($query);

例如,我们得到以下 URL:?sort=Seller.BcUsers.BcUserInfos.firstname&direction=asc,但由于错误而失败:Column not found: 1054 Unknown column 'Seller.BcUsers' in 'order clause' 我们理解错误的含义,但不知道如何修复它,如何按深度关联的数据进行排序。

【问题讨论】:

    标签: php sorting cakephp pagination cakephp-3.0


    【解决方案1】:

    通过标识符进行排序

    您似乎将此与例如包含或按关联过滤的工作方式相混淆,其中需要“路径”才能在 PHP 级别检索关联信息。

    排序不是这样工作的,它纯粹发生在 SQL 级别,其中关联的表通过它们各自的别名加入。它使用仅由别名和字段名组成的标识符,因此您只需引用关联字段,例如 BcUserInfos.firstname 而不是 Seller.BcUsers.BcUserInfos.firstname

    别名在加入单个查询时必须是唯一的

    您遇到的另一个问题是存在重复的别名,即包含两次 BcUserInfos,这不适用于 1:1 关联,因为它们都包含在同一个 SQL 查询中。

    这很可能会导致问题,因为查询构建器没有包含两个关联的名称冲突解决方案,而是第一个包含的关联将获胜,后面的将根本不包含在内。

    您可能必须重命名它们,添加其他的,或者甚至手动加入表格。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-02-27
      • 2018-02-15
      • 1970-01-01
      • 1970-01-01
      • 2017-03-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多