我们无法通过深度关联的数据对事务进行排序。大部分属于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'
我们了解错误的含义,但不知道如何解决错误,如何按深度关联数据进行排序。
答案 0 :(得分:0)
您似乎将此与例如包含或按关联过滤的方式相混淆,其中"路径"是在PHP级别检索关联信息所必需的。
排序不会以这种方式工作,它完全发生在SQL级别,其中关联的表通过各自的别名加入。它会占用标识符,标识符只包含别名和字段名称,因此您只需引用关联字段,例如BcUserInfos.firstname
而不是Seller.BcUsers.BcUserInfos.firstname
。
你遇到的另一个问题是存在重复的别名,即BcUserInfos
包含两次,这对于1:1
关联不起作用,因为它们都包含在同一个SQL中查询。
这很可能会导致问题,因为查询构建器没有包含两个关联的名称冲突解决方案,而是首先包含的关联将获胜,以下将不包括在内。
您可能需要重命名它们,添加其他内容,甚至可能手动加入表格。