You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Laravel的User查询构建器中添加DB原生查询

如何将原生DB JOIN查询整合到Eloquent查询构建器中

嘿,我来帮你搞定这个问题!你已经用User::query()初始化了Eloquent查询构建器,现在要把复杂的原生JOIN语句加进去,其实用Laravel提供的joinRaw()方法就能轻松解决,下面给你详细的示例和说明:

基础用法:直接添加原生JOIN

如果你的原生JOIN逻辑已经写好,直接用joinRaw()把它附加到查询构建器上就行,它能完美兼容你已有的条件判断逻辑:

// 初始化查询构建器
$user = User::query();

// 根据请求参数添加条件
if ($request->type == 'test') {
    $user->where(DB::raw("users.is_verified = 1"));
}

// 加入你的复杂原生JOIN查询(替换成你实际的语句)
$user->joinRaw("JOIN orders ON users.id = orders.user_id AND orders.order_status = 'shipped'");

// 执行查询并获取结果
$users = $user->get();

带条件的JOIN(仅满足特定场景时添加)

如果你的原生JOIN只需要在特定条件下执行(比如和$request->type的判断绑定),可以把joinRaw()放到条件分支里:

$user = User::query();

if ($request->type == 'test') {
    $user->where(DB::raw("users.is_active = 1"));
    // 仅当type为test时,才添加这个复杂子查询JOIN
    $user->joinRaw("JOIN (
        SELECT user_id, MAX(purchase_amount) as highest_spend
        FROM orders
        WHERE created_at >= DATE_SUB(NOW(), INTERVAL 30 DAY)
        GROUP BY user_id
    ) as user_spends ON users.id = user_spends.user_id");
}

$users = $user->get();

安全处理用户输入:参数绑定

如果你的原生JOIN里用到了用户输入的变量,一定要用参数绑定来避免SQL注入,joinRaw()支持传入参数数组:

匿名参数绑定

$status = $request->input('order_status');
$days = 30;

$user->joinRaw("JOIN orders 
    ON users.id = orders.user_id 
    AND orders.status = ? 
    AND orders.created_at >= DATE_SUB(NOW(), INTERVAL ? DAY)", 
    [$status, $days]
);

命名参数绑定

$user->joinRaw("JOIN orders 
    ON users.id = orders.user_id 
    AND orders.status = :status 
    AND orders.created_at >= DATE_SUB(NOW(), INTERVAL :days DAY)", 
    ['status' => $status, 'days' => $days]
);

这种方式既保留了你原生JOIN的灵活性,又保证了查询的安全性。

替代方案:DB::raw()配合join()

如果你更习惯用join()方法,也可以把原生的JOIN片段用DB::raw()包裹:

$user->join(DB::raw("(SELECT * FROM orders WHERE status = 'shipped') as shipped_orders"), function ($join) {
    $join->on('users.id', '=', 'shipped_orders.user_id');
});

不过对于复杂的原生JOIN来说,joinRaw()会更简洁直接。

内容的提问来源于stack exchange,提问作者Victor

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 10:14:43