如何使用Eloquent(Laravel)关联插入记录?

3
我有两张表:UserActivitiesActivities
活动:
| Column | Type             |
|--------|------------------|
| id     | int              |
| name   | varchar(255)     |
|        |                  |

用户活动:
| Column      | Type | Comment                  |
|-------------|------|--------------------------|
| id          | int  |                          |
| user_id     | int  |                          |
| activity_id | int  | //id of activity by name |

现在要将一个项目项插入到 UserActivity 模型中,我必须编写两个类似于这样的语句。
$activity = Activity::where('name', '=', 'user_login')->first();
UserActivity::create(['user_id' => Auth::login(), 'activity_id' => $activity->id]);

虽然这很好,但我刚刚在阅读有关Eloquent关系的内容,并想知道是否有一种方法可以创建belongsTo或某种关系并直接像这样插入。
UserActivity::create(['user_id' => Auth::login(), 'activity' => 'user_login']);

它会自动通过搜索名称插入activity_id吗?这可能吗?

2
像 https://laravel.com/docs/5.6/eloquent-relationships#inserting-and-updating-related-models 这样的吗? - brombeer
不,这是不可能的,你需要在插入活动之前找到活动ID。如果你知道它,你可以这样做:\Auth::user()->userActivities()->save(new UserActivity(["activity_id" => $id ]) - apokryfos
1个回答

1

在阅读了@kerbholz的评论后,我进行了更多的研究,我认为这是正确的做法?

Activity.php(模型)

class Activity extends Model {
    public function user_activities() {
        return $this->hasMany(UserActivity::class);
    }
}

主要代码:
Activity::where('name', '=', 'user_login')->first()->user_activities()
    ->create(['user_id' => Auth::id()]);

在我的情况下,这确保了Activity名称始终存在:

Activity::updateOrCreate(['name' => 'user_test'])->user_activities()->create(['user_id' => 1]);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接