这是原始SQL中的查询:
SELECT *
FROM (
SELECT `characters`.`id`,`characters`.`refreshToken`,
`characters`.`name`,max(`balances`.`created_at`) as `refreshDate`
FROM `characters`
INNER JOIN `balances` ON `characters`.`id` = `balances`.`character`
WHERE `characters`.`refreshToken` IS NOT NULL
GROUP BY `characters`.`id`
) AS `t1`
WHERE `refreshDate` < '2017-03-29';
我在phpMyAdmin中对此进行了测试,并返回了预期的结果。但是我在我的PHP应用程序中使用了Eloquent和Laravel库,我不知道如何处理它。在这种情况下子查询究竟是如何工作的?
答案 0 :(得分:5)
您可以将子查询作为表执行,但需要先创建子查询,然后将绑定合并到父查询中:
$sub = Character::select('id', 'refreshToken', 'name')
->selectSub('MAX(`balances`.`created_at`)', 'refreshDate')
->join('balances', 'characters.id', '=', 'balances.character')
->whereNotNull('characters.refreshToken')
->groupBy('characters.id');
DB::table(DB::raw("($sub->toSql()) as t1"))
->mergeBindings($sub)
->where('refreshDate', '<', '2017-03-29')
->get();
如果这是您的整个查询,您可以在没有子查询的情况下执行此操作,并使用having()
代替:
Character::select('id', 'refreshToken', 'name')
->selectSub('MAX(`balances`.`created_at`)', 'refreshDate')
->join('balances', 'characters.id', '=', 'balances.character')
->whereNotNull('characters.refreshToken')
->groupBy('characters.id')
->having('refreshDate', '<', '2017-03-29');
答案 1 :(得分:3)
您可以在Eloquent中使用子查询,方法是将它们指定为where
方法的闭包。例如:
$characters = Character::where(function ($query) {
// subqueries goes here
$query->where(...
...
->groupBy('id');
})
->where('refreshDate', '<', '2017-03-29')
->get();
您必须将方法链接到上面示例中传递给闭包的$query
变量。
如果要将任何变量传递给子查询,则需要use
关键字:
$characterName = 'Gandalf';
$characters = Character::where(function ($query) use ($characterName) {
// subqueries goes here
$query->where('name', $characterName)
...
->groupBy('id');
})
->where('refreshDate', '<', '2017-03-29')
->get();