我已经在cakephp 3中完成了一个联合,但是该联合正在这样做,以便首先显示买方表记录,然后显示租户。而我希望根据“购买者”和“租户”表中的已创建字段进行排列,因此最新记录将首先出现。我尝试使用Epilog进行该操作,但给出了错误
错误:SQLSTATE [42S22]:找不到列:1054在'order子句'中'创建'未知列
$tenant = $this->Tenants
->find('all', [
'fields' => ['Tenants.id', 'Tenants.created', 'Consumers.type'],
'conditions' => ['Tenants.client_id' => '1'],
'order' => 'Tenants.created desc'
])
->contain(['Consumers']);
$buyer = $this->Buyers
->find('all', [
'fields' => ['Buyers.id', 'Buyers.created', 'Consumers.type'],
'conditions' => ['Buyers.client_id' => '1'],
'order' => 'Buyers.created desc'
])
->contain(['Consumers']);
$results = $buyer->unionAll($tenant);
$results->epilog('ORDER BY created DESC LIMIT 7 OFFSET 7');
答案 0 :(得分:0)
高级ORM查询构建器将使用别名选择列,即它将创建SELECT
子句,如下所示:
SELECT Tenants.id AS Tenants__id, Tenants.created AS Tenants__created, etc...
因此,您的Epilog片段将不会看到created
列,因此会出现错误。在这种情况下,最简单的方法是通过其位置编号来引用该列(尽管至少在不推荐使用IIRC的MySQL中如此):
ORDER BY 2 DESC
或者另外选择一个带有通用别名的created
列,例如:
['Tenants.id', 'Tenants.created', 'created' => 'Tenants.created', 'Consumers.type']
['Buyers.id', 'Buyers.created', 'created' => 'Buyers.created', 'Consumers.type']
将选择类似Tenants.created AS created
的列,您可以通过ORDER BY
在created
子句中引用它。
至少在MySQL中,如果两个查询对同一列使用不同的别名(因为联合选择基于位置的工作),似乎也可以引用其中一个别名,但是我不确定这是否是对于其他DBMS也是如此,无论如何为了完整起见,以下内容也可以工作:
ORDER BY Tenants__created DESC