1

我使用 Laravel 8。我有 3 张桌子。课程表、用户课程和用户表。我想获得用户课程。我用 tinker 试了一下:Course::find(1)->user_courses - 它工作正常,还给我 user_course。

UserCourse::find(1)->user_course - 问题就在这里,这将返回“null”

如何获得用户课程?

课程表

    Schema::create('courses', function (Blueprint $table) {
        $table->id();
        $table->string('title');
        $table->timestamps();
    });

用户课程表

    Schema::create('user_courses', function (Blueprint $table) {
        $table->id();
        $table->foreignId('user_id')->constrained()->onDelete('cascade');
        $table->foreignId('course_id')->constrained()->onDelete('cascade');
        $table->timestamps();
    });

用户表

    Schema::create('users', function (Blueprint $table) {
        $table->id();
        $table->string('email')->unique();
        $table->string('username')->unique();
        $table->string('password');
        $table->timestamp('updated_at')->nullable();
        $table->timestamp('created_at')->nullable();
    });

课程.php

class Course extends Model
{
use HasFactory;

protected $fillable = [
    'title',
];

public function user_courses()
{
    return $this->hasMany(UserCourse::class);
}
}

用户课程.php

class UserCourse extends Model
{
use HasFactory;

protected $fillable = [];


public function user_course()
{
    return $this->belongsTo(Course::class);
}
}
4

1 回答 1

2

您的数据库结构使得课程和用户之间的关系是多对多关系,中间有一个数据透视表。

您需要进行一些更正才能使其看似与 laravel 约定一起工作。

- 数据透视表名称应该course_user没有主键

 Schema::create('course_user', function (Blueprint $table) {
        $table->foreignId('user_id')->constrained()->onDelete('cascade');
        $table->foreignId('course_id')->constrained()->onDelete('cascade');
        $table->timestamps();
    });

- 删除 UserCourse.php 模型,因为它是一个支点

- 在用户模型中定义关系课程如下

用户.php

public function courses()
{
    return $this->belongsToMany(Course::class);
}

- 定义课程模型中的关系用户如下

课程.php

public function users()
{
    return $this->belongsToMany(User::class);
}

现在要获取任何用户课程,只需运行User::find(1)->courses

相同的事情来获得属于相同 couses 的用户Course::find(1)->users

获取用户未上过的课程:

$userId = 1;
$courses = Course::whereDoesntHave('users', function($userQB) use($userId) {
    $userQB->where('id',$userId);
})->get();
于 2021-04-26T07:59:01.560 回答