核心概念理解
在 Laravel Eloquent ORM 中,三种基本关系的中文含义和语义:
-
hasOne:有一个 → A 有一个 B(一对一关系)
-
hasMany:有很多 → A 有很多 B(一对多关系)
-
belongsTo:属于 → A 属于 B(从属关系)
实践案例:三表关系设计
我们通过三个相关表来深入理解这些关系:
数据表结构
|
|
用户分组表(user_groups):id, title 用户表(users):id, user_group_id, username, password 用户信息表(profiles):id, user_id, nickname, sex |
关系分析
-
用户表关联用户分组表:每个用户需要知道属于哪个用户分组
-
用户信息表关联用户表:每条用户信息数据对应一个特定用户
关系定义与模型实现
1. 用户模型(User)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
|
<?php namespace App\Models; use Illuminate\Database\Eloquent\Model; class User extends Model { /** * 用户属于一个用户组(belongsTo:从属关系) */ public function userGroup() { // belongsTo(关联模型, 外键, 关联键) return $this->belongsTo(UserGroup::class, 'user_group_id', 'id'); } /** * 用户有一个档案信息(hasOne:一对一关系) */ public function profile() { // hasOne(关联模型, 外键, 本地键) return $this->hasOne(Profile::class, 'user_id', 'id'); } } |
2. 用户分组模型(UserGroup)
|
|
<?php namespace App\Models; use Illuminate\Database\Eloquent\Model; class UserGroup extends Model { /** * 用户组有多个用户(hasMany:一对多关系) */ public function users() { return $this->hasMany(User::class, 'user_group_id', 'id'); } } |
3. 用户信息模型(Profile)
|
|
<?php namespace App\Models; use Illuminate\Database\Eloquent\Model; class Profile extends Model { /** * 用户信息属于一个用户(belongsTo:从属关系) */ public function user() { return $this->belongsTo(User::class, 'user_id', 'id'); } } |
关系查询实践
基本数据查询
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
|
// 获取用户及其关联数据 $user = User::find(1); // 访问用户组信息(belongsTo关系) $userGroup = $user->userGroup; echo $userGroup->title; // 访问用户档案信息(hasOne关系) $profile = $user->profile; echo $profile->nickname; // 访问用户组的所有用户(hasMany关系) $userGroup = UserGroup::find(1); $users = $userGroup->users; foreach ($users as $user) { echo $user->username; } |
高级查询技巧
|
|
// 预加载关联数据(解决N+1查询问题) $users = User::with(['userGroup', 'profile'])->get(); // 条件查询关联数据 $activeGroupUsers = User::whereHas('userGroup', function ($query) { $query->where('status', 'active'); })->get(); // 关联数据计数 $userGroups = UserGroup::withCount('users')->get(); foreach ($userGroups as $group) { echo "分组 {$group->title} 有 {$group->users_count} 个用户"; } |
核心特性对比
hasOne/hasMany 特性
belongsTo 特性
来源:https://blog.csdn.net/xcbzsy/article/details/103237171(deepseek改写)
「三年博客,如果觉得我的文章对您有用,请帮助本站成长」
共有 0 - Laravel Eloquent 关系详解:hasOne、hasMany、belongsTo 的完整指南