使用 Eloquent 從資料透視表中檢索具有特定資訊的所有數據
P粉464208937
P粉464208937 2023-09-07 21:40:28
0
1
533

我在使用者和課程之間有一個多對多關係,其中包含一個資料透視表Users_Courses,其中包含isComplete 值,但我似乎無法在不循環每個使用者並獲取他們的課程的情況下檢索isComplete 值然後循環每個課程取得樞軸資料。

我發現的所有範例都是將isComplete 值對應到帶有循環的課程,但這似乎對程式造成了極大的負擔,而且我並沒有真正發現它有吸引力,這就是為什麼我要製作我的自己的問題在這裡。如果我還沒有看到這個問題的答案,請在下面鏈接它,因為我似乎找不到它。

此外,我正在使用 Laravel-9 和 MySQL。

我現在檢索的資料結構如下所示:

"data": [
        {
            "id": 2,
            "fname": "name",
            "lname": "last name",
            "email": "mail@mail.com",
            "courses": [
                {
                    "id": 1,
                    "name": "test_course_1",
                    "description": "this is a test course for testing"
                },
                {
                    "id": 2,
                    "name": "test_course_2",
                    "description": "this is also a test course"
                },
                {
                    "id": 3,
                    "name": "test_course_3",
                    "description": "this course is a test course"
                }
            ]
        }
    ]

我正在尋找一種方法來檢索樞軸值 isComplete 與 Eloquent 並獲取課程本身的數據,就像這樣或類似的東西。

換句話說,我想透過資料透視表值 isComplete 來檢查使用者是否完成了課程,如下例所示。 < /p>#

"data": [
        {
            "id": 2,
            "fname": "name",
            "lname": "last name",
            "email": "mail@mail.com",
            "courses": [
                {
                    "id": 1,
                    "name": "test_course_1",
                    "description": "this is a test course for testing",
                    "isComplete": 1
                },
                {
                    "id": 2,
                    "name": "test_course_2",
                    "description": "this is also a test course",
                    "isComplete": 0
                },
                {
                    "id": 3,
                    "name": "test_course_3",
                    "description": "this course is a test course",
                    "isComplete": 0
                }
            ]
        }
    ]

我現在的程式碼如下所示:

class User extends Authenticatable
{
    public function courses()
    {
        return $this->belongsToMany(Course::class, 'user_courses')
            ->withPivot('isCompleted');
    }
}
class Course extends Model
{
    public function users()
    {
        return $this->belongsToMany(User::class, 'user_courses')
            ->withPivot('isCompleted');
    }
}
class UserController extends Controller
{
    public function getUsersById(int $user_id)
    {
        try {
            $users = User::where('id', $user_id)
                ->with('courses')
                ->get();

            return response()->json([
                'success' => true,
                'data' => $users
            ]);
        } catch (Throwable $th) {
            return response()->json([
                'success' => false,
                'data' => null,
                'message' => $th,
            ]);
        }
    }
}

我知道它在程式碼中稱為 isCompleted ,但在資料庫中也這麼叫。這是一個尚未修復的打字錯誤:D

P粉464208937
P粉464208937

全部回覆(1)
P粉244155277

換句話說,我想透過資料透視表值 isComplete 檢查使用者是否已完成課程,如下例所示。

您是否在文件中閱讀了有關使用資料透視表列進行過濾的資訊:https://laravel.com/docs/9.x/eloquent-relationships#filtering-queries-via-intermediate- table-columns

如果您只需要完成的課程,您可以將關係稱為

$users = User::where('id', $user_id)
        ->with(['courses' => function($query) {
            $query->wherePivot('isCompleted', 1);  // use quotes if its datatype is enum in database.
        }])
        ->get();

或您可以為模型中的已完成、未完成建立自訂關係。

class User extends Authenticatable
{
    public function courses()
    {
        return $this->belongsToMany(Course::class, 'user_courses')
            ->withPivot('isCompleted');
    }

    public function completedCourses()
    {
        $this->courses()->wherePivot('isCompleted', 1);
    }
    
    public function InCompleteCourses()
    {
        $this->courses()->wherePivot('isCompleted', 0);
    }
}

在使用者控制器中,您可以將它們稱為

$users = User::where('id', $user_id)
            ->with('completedCourses')
            ->get();
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板