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

在Laravel Eloquent中实现一对多关系及相关操作咨询

Laravel Eloquent 一对多关系:创建关联文章与查询用户文章

前提说明

你的User和Post模型的一对多关系定义是正确的,需确保posts数据库表包含user_id字段(类型为unsigned bigint,并设置外键关联users表的id字段),同时在Post模型中配置可填充字段:

// Post.php
protected $fillable = ['title', 'content', 'user_id'];
// 或者设置允许所有字段填充
protected $guarded = [];

创建用户并关联多篇Post

方式1:先创建用户,再批量生成文章

// 创建用户
$user = User::create([
    'name' => 'John Doe',
    'email' => 'john@example.com',
    'password' => bcrypt('password123'),
]);

// 为该用户批量创建文章
$user->posts()->createMany([
    ['title' => '第一篇文章', 'content' => '文章内容1'],
    ['title' => '第二篇文章', 'content' => '文章内容2'],
    ['title' => '第三篇文章', 'content' => '文章内容3'],
]);

方式2:创建用户后逐个添加文章

$user = User::create([
    'name' => 'Jane Smith',
    'email' => 'jane@example.com',
    'password' => bcrypt('password456'),
]);

// 单独创建单篇文章
$user->posts()->create(['title' => '单独发布的文章', 'content' => '这是单独编写的内容']);

获取指定用户的所有Post

方式1:通过用户模型直接获取关联文章

// 根据用户ID查找用户
$user = User::find(1);
// 获取该用户的所有文章(返回Eloquent集合)
$posts = $user->posts;

// 遍历输出文章标题
foreach ($posts as $post) {
    echo $post->title;
}

方式2:直接从Post模型筛选指定用户的文章

// 直接查询user_id为1的所有文章
$posts = Post::where('user_id', 1)->get();

// 或者通过用户属性筛选,比如邮箱
$user = User::where('email', 'john@example.com')->first();
$posts = Post::where('user_id', $user->id)->get();

方式3:预加载关联(优化N+1查询问题)

如果需要查询多个用户及其文章,使用预加载避免重复查询数据库:

// 预加载所有用户的文章
$users = User::with('posts')->get();

foreach ($users as $user) {
    echo "{$user->name}的文章:";
    foreach ($user->posts as $post) {
        echo "- {$post->title}";
    }
}

内容的提问来源于stack exchange,提问作者Harshad Kanani

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 06:32:32