定义关联
例如,我们可以在 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
]
);

本文详细介绍了 Laravel 的 Eloquent ORM 中的关联关系,包括一对一关联、动态属性、预加载、关联模型计数以及如何插入和更新关联模型。通过示例展示了如何使用 has、orHas、doesntHave 方法查询存在或不存在的关联,以及 withCount 方法计算关联模型的数量。此外,还讲解了预加载关联时如何指定列和添加约束,以及 save 和 create 方法的区别。这些内容对于高效处理数据库查询和操作关联模型至关重要。
652

被折叠的 条评论
为什么被折叠?



