如何通过外键在Eloquent主查询中获取关联模型实例
解决方案
1. 定义Eloquent关联
先在User模型中建立与AccessLevel模型的关联:
// app/Models/User.php namespace App\Models; use Illuminate\Database\Eloquent\Model; class User extends Model { // 关联AccessLevel模型,指定外键为access_level public function accessLevel() { return $this->belongsTo(AccessLevel::class, 'access_level'); } }
创建AccessLevel模型(若未创建):
// app/Models/AccessLevel.php namespace App\Models; use Illuminate\Database\Eloquent\Model; class AccessLevel extends Model { // 若表名为access_level(非默认复数),需添加此行 // protected $table = 'access_level'; }
2. 查询并替换权限ID为名称
方法一:预加载关联+集合转换
这种方式先预加载关联数据,再将权限ID替换为名称,同时移除关联对象避免出现relations键:
// UserController中的方法 public function index() { $users = User::with('accessLevel')->get()->map(function ($user) { // 将access_level字段替换为权限名称 $user->access_level = $user->accessLevel->name; // 移除关联模型实例 unset($user->accessLevel); return $user; }); return $users; }
方法二:JOIN查询一次性获取
直接通过数据库关联查询,一步得到包含权限名称的结果:
public function index() { $users = User::select('users.*', 'access_levels.name as access_level') ->join('access_levels', 'users.access_level', '=', 'access_levels.id') ->get(); return $users; }
针对Books & Category案例的处理
你用Book::with('category')->find(1)得到带relations键的结果,是因为预加载了关联模型。要替换为分类名称,可按以下方式处理:
集合转换方式
$book = Book::with('category')->find(1); // 替换category_id为分类名称(假设外键是category_id) $book->category_id = $book->category->name; // 移除关联对象 unset($book->category); dd($book);
JOIN查询方式
$book = Book::select('books.*', 'categories.name as category') ->join('categories', 'books.category_id', '=', 'categories.id') ->find(1); dd($book);
内容的提问来源于stack exchange,提问作者Muddassir Ahmed
相关产品推荐
相关产品推荐

