gpt4 book ai didi

php - Laravel 数据透视表创建关联一次,然后更新

转载 作者:行者123 更新时间:2023-12-01 00:45:13 26 4
gpt4 key购买 nike

我有以下表格:

用户:

userID
...

教训:

lessonID
...

Users_Lessons_Status(用作数据透视表并保存其他信息):

userID references User.userID
lessonID references Lessons.lessonID
latestSectionID
percentComplete

我想要做的是,对于每个用户,对于每节课,数据透视表中应该有一行告诉用户在该节课中完成了多少以及他们最新的部分 ID 是什么。也就是说,userIDlessonID(主键?)应该是一对唯一的。

我已经像这样设置了我的模型:

<?php

class User extends Eloquent implements UserInterface, RemindableInterface {

...


public function lessonStatuses()
{
return $this->belongsToMany('Lesson', 'users_lessons_status', 'lessonID', 'userID')->withPivot('latestSectionID', 'percentComplete');
}

}

<?

class Lesson extends Eloquent {

protected $table = 'lessons';
protected $primaryKey = 'lessonID';

public function userStatuses()
{
return $this->belongsToMany('User', 'users_lessons_status', 'userID', 'lessonID');
}


}

?>

我现在的路线是这样的:

Route::post('dbm/users/setLatestSectionID', function() {
if(Auth::check()) {
$user = User::find(Input::get('userID'));
$lesson = Lesson::find(Input::get('lessonID'));
$us = $user->lessonStatuses();
$us->attach($lesson->lessonID,
["latestSectionID" => Input::get('latestSectionID'), "percentComplete" => Input::get('percentComplete')] );
}
});

这行得通,但是,每次我为相同的 userIDlessonID 更新它时,它都会创建一个新行,因此这对不再是唯一的。为此,我应该使用哪些方法?我在文档中尝试了 save()attach()push(),但我不确定在这里使用哪一个。

编辑:为澄清起见,生成的表格应如下所示:

id|userID|lessonID|latestSectionID|percentComplete
1 1 1 X Y
2 1 2
3 1 3
4 2 1
5 3 1
6 3 2
....

编辑 2:修复了 User->belongsToMany() 方法并添加了 withPivot 调用。

最佳答案

这似乎是一个错误,不过你可以这样做:

...->sync([$id], false); // detaching set to false, so it will only insert new rows, skip existing and won't detach anything

编辑:正如评论中所说 - 它对你不起作用,因为你想设置数据透视表。所以目前基本上没有办法做到这一点,但应该这样做:

// belongsToMany.php
public function attachOrUpdate($id, array $attributes = array(), $touch = true)
{
if ($id instanceof Model) $id = $id->getKey();

if ( ! $this->allRelatedIds()->contains($id)) // getRelatedIds() in prior to v5.4
{
return $this->attach($id, $attributes, $touch);
}
else if ( ! empty($attributes))
{
return $this->updateExistingPivot($id, $attributes, $touch);
}
}

我要测试它,如果它通过,向 4.1 发送拉取请求

关于php - Laravel 数据透视表创建关联一次,然后更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23019239/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com