我得到了一个这样的查询:
select av.id as idd, login as start_time, logout as end_time, av.app_name as app, av.machine_name, sum(cast(ai.app_stage as unsigned)) as points, pc.name as place from application_visits as av
LEFT JOIN application_interactions as ai
on ai.app_name = av.app_name
and av.machine_name = ai.machine_name
and ai.date between av.login and av.logout
and ai.type = 'points'
LEFT JOIN devices as dv
on dv.machine_name = av.machine_name
LEFT JOIN places as pc
on dv.place_id = pc.id
where av.user_id = '123'
group by av.id, pc.name
order by place;我必须在两个部署服务器上使用它们,一个使用MySQL,另一个使用PostgreSQL。问题是,当我聚合'points‘列时,我必须在PG中将它们转换为INT,并在MySQL中将它们转换为unsigned (或者不加符号)。
我用过一点Eloquent,但是我想对它进行抽象,但我从来没有从SQL转换到它,或者反过来。什么是处理它的最好方法?我是否可以轻松地将其转换为Eloquent或其他查询构建器,或者是否可以检查我正在使用的SQL,然后执行两个查询中的一个?
发布于 2018-03-13 02:58:45
一种可能的方法是使用一个名为Orator的工具,该工具可以将原始SQL查询转换为query Builder语法。这是在您的SQL查询上运行它后的输出:
DB::select(`av.id as idd`,`login as start_time`,`logout as end_time`,`av.app_name as app`,`av.machine_name`,`pc.name as place`)
->addSelect(DB::raw(`sum(cast) as points`))
->from(`application_visits as av`)
->join(`application_interactions as ai`, function($join) {
$join->on(`ai.app_name`, `=`, `av.app_name`)
->on(`av.machine_name`, `=`, `ai.machine_name`)
->on(`ai.date`, `between`, `av.login`)
->on(`av.logout`)
->on(`ai.type`, `=`, `points`);
})
->join(`devices as dv`, function($join) {
$join->on(`dv.machine_name`, `=`, `av.machine_name`);
})
->join(`places as pc`, function($join) {
$join->on(`dv.place_id`, `=`, `pc.id`);
})
->where(`av.user_id`, `=`, 123)
->groupBy(`av.id`)
->groupBy(`pc.name`)
->orderByRaw(`place ASC`)
->get();这将返回一个包含你的结果的集合,我自己还没有运行过这段代码,但是它可能是一个开始的地方,然后你可以从那里调试并迭代你的解决方案。
https://stackoverflow.com/questions/49234377
复制相似问题