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

Laravel Eloquent多表查询问题:DB::table无法传入多表名

正确的Laravel实现方式

原始SQL属于隐式多表连接写法,旧工具生成的DB::table("users, friends")在新版Laravel中已不支持,推荐用以下两种符合规范的方式实现:

方式一:查询构造器(Query Builder)

使用join方法显式定义表关联,语法适配新版Laravel:

DB::table('users')
    ->join('friends', 'friends.friend_id', '=', 'users.id')
    ->select('users.name')
    ->where('users.super_admin', false)
    ->where('friends.user_id', 4)
    ->where('friends.status', 1)
    ->get();

方式二:Eloquent模型关联(推荐)

若已定义User和Friend模型,可通过关联关系简化查询:

  1. 先在模型中定义关联:
// app/Models/User.php
namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class User extends Model
{
    // 关联好友记录(friends表中friend_id对应当前用户id)
    public function friendRelations()
    {
        return $this->hasMany(Friend::class, 'friend_id');
    }
}
// app/Models/Friend.php
namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class Friend extends Model
{
    // 关联好友对应的用户信息
    public function user()
    {
        return $this->belongsTo(User::class, 'friend_id');
    }
}
  1. 通过关联查询目标数据:
    从User模型出发查询:
use App\Models\User;

User::where('super_admin', false)
    ->whereHas('friendRelations', function ($query) {
        $query->where('user_id', 4)
              ->where('status', 1);
    })
    ->select('name')
    ->get();

从Friend模型出发查询:

use App\Models\Friend;

Friend::where('user_id', 4)
    ->where('status', 1)
    ->with(['user' => function ($query) {
        $query->where('super_admin', false)
              ->select('id', 'name');
    }])
    ->get()
    ->pluck('user.name')
    ->filter();

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 02:00:10