cakephp 3无法按深度关联数据排序

时间:2017-03-23 10:35:30

标签: php sorting cakephp pagination cakephp-3.0

我们无法通过深度关联的数据对事务进行排序。大部分属于Too和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'
]);

BcUsers:

$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);

我们得到以下网址:?sort=Seller.BcUsers.BcUserInfos.firstname&direction=asc例如,我们失败并出现错误:Column not found: 1054 Unknown column 'Seller.BcUsers' in 'order clause'我们了解错误的含义,但不知道如何解决错误,如何按深度关联数据进行排序。

1 个答案:

答案 0 :(得分:0)

排序通过标识符

进行

您似乎将此与例如包含或按关联过滤的方式相混淆,其中"路径"是在PHP级别检索关联信息所必需的。

排序不会以这种方式工作,它完全发生在SQL级别,其中关联的表通过各自的别名加入。它会占用标识符,标识符只包含别名和字段名称,因此您只需引用关联字段,例如BcUserInfos.firstname而不是Seller.BcUsers.BcUserInfos.firstname

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

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

这很可能会导致问题,因为查询构建器没有包含两个关联的名称冲突解决方案,而是首先包含的关联将获胜,以下将不包括在内。

您可能需要重命名它们,添加其他内容,甚至可能手动加入表格。