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
            ]
        );
posted @   小信吖  阅读(100)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
点击右上角即可分享
微信分享提示