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模型,可通过关联关系简化查询:
- 先在模型中定义关联:
// 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'); } }
- 通过关联查询目标数据:
从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
相关产品推荐
相关产品推荐

