laravel学习笔记--模型关联
定义关联
例如,我们可以在 posts 关联的链式调用中附加一个约束条件
$user->posts()->where('active', 1)->get();
posts()就是定义的模型名
注意:关系名称不能与属性名称冲突,因为这会导致您的模型不知道要解析哪一个。
一对一
一对一是最基本的关联关系。例如,一个 User 模型可能关联一个 Phone 模型。为了定义这个关联,我们要写一个 phone 方法,在
User 模型中。 在 phone 方法内部调用 hasOne 方法并返回其结果
class User extends Model
{
/**
* 获取与用户相关的电话记录
*/
public function phone()
{
return $this->hasOne('App\Models\Phone');
}
}
动态属性
如果想访问模型关联的所有记录,而不附带查询条件,可以像属性一样访问关联
$user = User::find(2);
dd($user->blogs);
这个显示的是它的所有记录而不带查询构造器
而使用方法的方式去访问的话就会显示出查询构造器等数据
$user = User::find(2);
$data = $user->blogs();
看,两个显示的数据是不一样的
动态属性是 「懒加载」 的, 只有实际访问到才会加载关联数据。因此,通常用 预加载
来准备模型需要用到的关联数据。预加载能大量减少因加载模型关联执行的 SQL 语句。
查询已存在的关联
在查询时,可能需要将关联记录是否存在作为条件。例如,查出已发表过文章的用户。可以通过向 has 和 orHas 方法传递关联名称实现
//查询已存在的关联
$users = User::has('blogs')->get();
dd($users);
还可以指定运算符和数量来进一步自定义查询
//查询已存在的关联
$users = User::has('blogs', '>=', 5)->get();
dd($users);
查询不存在的关联
访问模型的记录时,有时候可能希望根据不存在的关系来筛选结果。 例如,假设您要检索所有 没有 发表过博客文章的用户。
为此,可以将关系的名称传递给doesntHave 和 orDoesntHave 方法
//查询不存在的关联
$users = User::doesntHave('blogs')->get();
dd($users);
关联模型计数
如果想要只计算关联结果的统计数量而不需要真实加载它们,可以使用 withCount 方法,它将放在结果模型的
{relation}_count 列
例如,每个用户发布过多少篇文章
//关联模型计数
$counts = User::withCount('blogs')->get();
dd($counts);
withCount()是为每一个数据新增一个{relation}_coun列,如图:
预加载
当以属性方式访问 Eloquent 关联时,关联数据「懒加载」。这意味着直到第一次访问属性时关联数据才会被真实加载。
//预加载
$users = User::with('blogs')->get();
预加载指定列
并不是总需要获取关系的每一列。在这种情况下,Eloquent 允许你为关联指定想要获取的列:
$users = User::with('blogs:user_id,title,id')->get();
如图:
为预加载添加约束
有时,你可能希望预加载一个关联,同时为预加载查询添加额外查询条件
比如,查询关联数据id大于3的数据
//为预加载添加约束
$users = User::with(['blogs' => function ($query) {
$query->where('id', '>', 3);
}])->get();
dd($users);
注意:在约束预加载时,不能使用 limit 和 take 查询构造器方法。
插入 & 更新关联模型
保存方法
Eloquent 为新模型添加关联提供了便捷的方法。例如,也许你需要添加一个新的 数据到一个 数据库 模型中。你不用在数据中中手动设置 id
属性,就可以直接使用关联模型的 save 方法将 数据 直接插入
比如:
//保存方法
$user = User::find(2);
$blog = new Blog(['title' => '文章标题', 'content' => '文章内容', 'category_id' => 1]);
$user->blogs()->save($blog);
这样保存数据是不用特意去写入user_id的 ,因为在模型关联的时候就有关联id了,所以,写入的时候,会自动去写入user_id
新增方法
除了 save 和 saveMany 方法外,你还可以使用 create 方法。它接受一个属性数组,同时会创建模型并插入到数据库中。 还有,
save 方法和 create 方法的不同之处在于, save 方法接受一个完整的 Eloquent 模型实例,而 create
则接受普通的 PHP 数组
//新增方法
$user = User::find(2);
$user->blogs()->create([
'title' => '文章标题2',
'content' => '文章内容2',
'category_id' => 1
]
);
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?