hyperf 应用模型写 union 子查问并做分页

最终须要实现的 sql 语句为如下所示:

SELECT    `dfo_al`.* FROM    (    (SELECT    `dfo_account_log`.`log_id`,    `dfo_account_log`.`change_time`,    `dfo_account_log`.`user_id`,    `dfo_account_log`.`pay_points`,    `dfo_account_log`.`change_type`,    `dfo_account_log`.`from_user_id`,    `dfo_u`.`user_id` AS `u_user_id`,    `dfo_u`.`username`,    `dfo_u`.`head_pic`,    `dfo_u`.`vip_time` FROM    `dfo_account_log`    LEFT JOIN `dfo_users` AS `dfo_u` ON `dfo_account_log`.`user_id` = `dfo_u`.`user_id` WHERE    ( `dfo_account_log`.`user_id` = 3649 AND `dfo_account_log`.`pay_points` > 0 )     AND ( `dfo_account_log`.`from_user_id` IS NULL OR `dfo_account_log`.`from_user_id` = 0 )     ) UNION    (SELECT    `dfo_account_log`.`log_id`,    `dfo_account_log`.`change_time`,    `dfo_account_log`.`user_id`,    `dfo_account_log`.`pay_points`,    `dfo_account_log`.`change_type`,    `dfo_account_log`.`from_user_id`,    `dfo_u`.`user_id` AS `u_user_id`,    `dfo_u`.`username`,    `dfo_u`.`head_pic`,    `dfo_u`.`vip_time` FROM    `dfo_account_log`    LEFT JOIN `dfo_users` AS `dfo_u` ON `dfo_account_log`.`from_user_id` = `dfo_u`.`user_id` WHERE    ( `dfo_account_log`.`user_id` = 3649 AND `dfo_account_log`.`pay_points` > 0 )     AND ( `dfo_account_log`.`from_user_id` IS NOT NULL OR `dfo_account_log`.`from_user_id` > 0 )     )     ) AS dfo_al ORDER BY    `log_id` DESC     LIMIT 2 OFFSET 0

hyperf 代码为

        $tbl = 'account_log';        $where = [            [$tbl . '.user_id', '=', auth()->user_id],            [$tbl . '.pay_points', '>', 0]        ];        $fields = [            $tbl . '.log_id',            $tbl . '.change_time',            $tbl . '.user_id',            $tbl . '.pay_points',            $tbl . '.change_type',            $tbl . '.from_user_id',            'u.user_id AS u_user_id',            'u.username',            'u.head_pic',            'u.vip_time'        ];        $table1 = $this->accountLogModel            ->leftJoin('users as u', $tbl . '.user_id', '=', 'u.user_id')            ->select($fields)            ->where($where)            ->where(function ($query) use ($tbl) {                $query->whereNull($tbl . '.from_user_id')->orWhere($tbl . '.from_user_id', 0);            });        $table2 = $this->accountLogModel            ->leftJoin('users as u', $tbl . '.from_user_id', '=', 'u.user_id')            ->select($fields)            ->where($where)            ->where(function ($query) use ($tbl) {                $query->whereNotNull($tbl . '.from_user_id')->orWhere($tbl . '.from_user_id', '>', 0);            });        $table = $table1->union($table2);        $tablePrefix = Db::connection()->getTablePrefix();  // 获取数据表前缀 => 或者应用  $tablePrefix = Db::getConfig('prefix'); 都能够        $model = $this->accountLogModel            ->mergeBindings($table->getQuery())            ->select(['al.*'])            ->from(Db::raw("({$table->toSql()}) as {$tablePrefix}" . 'al'));        return $model->orderBy('log_id', 'desc')->paginate(2);