cakephp 为什么UNION ALL查询将外部ORDER列视为未知列?

dfuffjeb  于 2022-11-24  发布在  PHP
关注(0)|答案(1)|浏览(143)

我使用了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”

9bfwbjaz

9bfwbjaz1#

如错误所述,没有date_event_start列。
取消普通SQL查询的链接,其中一个非表前缀的列将回退到引用所涉及的表之一,类似的情况不会发生在联合结果中,对于联合结果,您必须显式引用已选择的列。
因此,您必须确保选择的列没有表前缀,或者在ORDER子句中选择并使用正确的别名。

->select(['date_event_start_alias' => 'Events.date_event_start'])

// ...

->select(['date_event_start_alias' => 'GroupOfEvents.date_event_start'])

// ...

->order(['date_event_start_alias' => 'ASC'])

需要注意的是,至少对于MySQL和Postgres(我不确定其他DBMS,如SQLite或SQL Server),您实际上只需要为第一个SELECT设置别名。为所有select设置别名不会有任何损害,因此我在示例中包括了它,但实际上没有必要。
另请参阅

*Cookbook〉数据库访问和ORM〉查询生成器〉选择数据

相关问题