문제

다음 테이블이 있습니다.

사용자:

userID
...

수업:

lessonID
...

Users_Lessons_Status(피벗 테이블 역할을 하며 기타 정보를 보유함):

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

내가 원하는 것은 각 사용자에 대해 각 수업에 대해 사용자가 해당 수업에서 완료한 양과 최신 섹션 ID를 알려주는 행이 피벗 테이블에 있어야 한다는 것입니다.즉, 다음과 같은 고유한 쌍이 있어야 합니다. userID 그리고 lessonID (기본 키?).

나는 다음과 같이 모델을 설정했습니다.

<?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')] );
    }
});

이것은 작동하지만 동일한 내용을 업데이트할 때마다 새 행이 생성됩니다. userID 그리고 lessonID, 따라서 쌍은 더 이상 고유하지 않습니다.이 목적을 위해서는 어떤 방법을 사용해야 합니까?나는 둘 다 시도했다 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);
    }
}
.

파일을 테스트 할 것입니다.

다른 팁

나는 최근에 이 문제에 직면하여 다음과 같이 해결했습니다.

사용 updateExistingPivot 먼저 결과를 확인하고, 결과가 다음과 같다면 1 이는 동일한 행이 있다는 것을 의미합니다. userID 그리고 lessonID 성공적으로 업데이트되었습니다. 그렇지 않은 경우 결과는 다음과 같습니다. 0 이는 이 항목에 대한 행이 없다는 의미입니다. userID 그리고 lessonID, 이므로 새 행을 만들기 위해 첨부할 수 있습니다.

    $update_result = $us->updateExistingPivot($lesson->lessonID, 
            ["latestSectionID" => Input::get('latestSectionID'), "percentComplete" => Input::get('percentComplete')] );
    if($update_result == 0) {
        $us->attach($lesson->lessonID, 
            ["latestSectionID" => Input::get('latestSectionID'), "percentComplete" => Input::get('percentComplete')] );
    }

updateExistingPivot()를 사용해야합니다.

를 사용하도록 코드를 업데이트하십시오.
    $us->updateExistingPivot($lesson->lessonID, 
        ["latestSectionID" => Input::get('latestSectionID'), "percentComplete" => Input::get('percentComplete')], true );
.

마지막 매개 변수는 모든 관련 모델의 타임 스탬프를 업데이트합니다.그렇지 않은 경우 제거 또는 false로 설정할 수 있습니다.

레코드가 존재하지 않는 경우에만 연결하려면 다음과 같이 할 수 있습니다.

Route::post('dbm/users/setLatestSectionID', function() {
    if(Auth::check()) {
        $user = User::find(Input::get('userID'));

        $lesson = [
            "latestSectionID" => Input::get('latestSectionID'), 
            "percentComplete" => Input::get('percentComplete')
        ];

        $num_lessons = $user->lessonStatuses()->where('id', Input::get('lessonID'))->count();

        if($num_lessons == 0) {
            $user->attach($lesson->lessonID, $lesson);
        } else {
            $user->updateExistingPivot($lesson->lessonID, $lesson);

        }
    }
});
.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top