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

如何通过外键在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 19:15:40