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

cakephp 3无法按深度关联的数据排序,php,sorting,cakephp,pagination,cakephp-3.0,Php,Sorting,Cakephp,Pagination,Cakephp 3.0,我们无法根据深度关联的数据对交易进行排序。大部分属于和有一个协会。此处需要/未找到的任何信息将立即发布。表: 业务连续性交易: $this->belongsTo('Seller', [ 'className' => 'BcAccessCards', 'foreignKey' => 'seller', 'propertyName' => 'BcAccessCards', ]); $this->belongsTo('Buyer', [ '

我们无法根据深度关联的数据对交易进行排序。大部分属于和有一个协会。此处需要/未找到的任何信息将立即发布。表:

业务连续性交易:

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

$this->belongsTo('BcUsers', [
    'className' => 'BcUsers',
    'foreignKey' => 'user',
    'propertyName' => '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);
我们得到以下URL:
?sort=Seller.BcUsers.BcUserInfos.firstname&direction=asc
例如,我们失败了,出现了一个错误:
列未找到:1054未知列“Seller.BcUsers”在“order子句”中
我们理解错误的含义,但不知道如何修复它,如何按深度关联的数据进行排序。

通过标识符进行排序 您似乎混淆了这一点,例如容器或关联过滤的工作方式,其中需要“路径”才能在PHP级别检索关联信息

排序不是这样工作的,它只发生在SQL级别,关联的表通过各自的别名连接在一起。它吃标识符,标识符只由别名和字段名组成,因此您只需引用关联字段,例如
BcUserInfos.firstname
,而不是
Seller.BcUsers.BcUserInfos.firstname

当加入单个查询时,别名必须是唯一的 另一个问题是存在重复的别名,即
BcUserInfos
包含两次,这对
1:1
关联不起作用,因为它们都包含在同一个SQL查询中

这很可能会导致问题,因为查询生成器没有包含这两个关联的名称冲突解决方案,而首先包含的关联将获胜,下面的关联将不被包含

您可能需要重命名这些表,添加其他表,或者甚至手动将表加入其中。

通过标识符进行排序 您似乎混淆了这一点,例如容器或关联过滤的工作方式,其中需要“路径”才能在PHP级别检索关联信息

排序不是这样工作的,它只发生在SQL级别,关联的表通过各自的别名连接在一起。它吃标识符,标识符只由别名和字段名组成,因此您只需引用关联字段,例如
BcUserInfos.firstname
,而不是
Seller.BcUsers.BcUserInfos.firstname

当加入单个查询时,别名必须是唯一的 另一个问题是存在重复的别名,即
BcUserInfos
包含两次,这对
1:1
关联不起作用,因为它们都包含在同一个SQL查询中

这很可能会导致问题,因为查询生成器没有包含这两个关联的名称冲突解决方案,而首先包含的关联将获胜,下面的关联将不被包含

您可能需要重命名这些表,添加其他表,或者甚至手动将这些表加入