我使用了unionAll()
并完美地返回了数据,但是我需要对数据进行排序并总是返回错误,因为列不存在。
$events = $this->Events
->find('available')
->where([
'Events.group_of_event_id IS NULL'
])
->select('Events.id')
->select('Events.name')
->select('Events.slug')
->select('Events.date_event_start')
->select([
'is_group' => 0
]);
$groups = $this->GroupOfEvents
->find('available')
->select('GroupOfEvents.id')
->select('GroupOfEvents.name')
->select('GroupOfEvents.slug')
->select('GroupOfEvents.date_event_start')
->select([
'is_group' => 1
]);
$limit = 10;
$page = 1;
if($this->request->query('limit'))
$limit = $this->request->query('limit');
if($this->request->query('page'))
$page = $this->request->query('page');
$offset = ($page - 1) * $limit;
$connection = ConnectionManager::get('default');
$union = $events->unionAll($groups)->epilog(
$connection
->newQuery()
->order(['date_event_start' => 'ASC'])
->limit($limit)
->offset($offset)
);
返回此错误:
错误:SQLSTATE[42 S22]:未找到列:1054“order子句”中有未知的数据行“date_event_start”
1条答案
按热度按时间9bfwbjaz1#
如错误所述,没有
date_event_start
列。取消普通SQL查询的链接,其中一个非表前缀的列将回退到引用所涉及的表之一,类似的情况不会发生在联合结果中,对于联合结果,您必须显式引用已选择的列。
因此,您必须确保选择的列没有表前缀,或者在
ORDER
子句中选择并使用正确的别名。需要注意的是,至少对于MySQL和Postgres(我不确定其他DBMS,如SQLite或SQL Server),您实际上只需要为第一个
SELECT
设置别名。为所有select设置别名不会有任何损害,因此我在示例中包括了它,但实际上没有必要。另请参阅
*Cookbook〉数据库访问和ORM〉查询生成器〉选择数据