Laravel 一对多(反向)/属于返回 null

Posted

技术标签:

【中文标题】Laravel 一对多(反向)/属于返回 null【英文标题】:Laravel One To Many (Inverse) / Belongs To return null 【发布时间】:2021-07-19 14:00:04 【问题描述】:

我使用 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();
    );

Course.php

class Course extends Model

use HasFactory;

protected $fillable = [
    'title',
];

public function user_courses()

    return $this->hasMany(UserCourse::class);


UserCourse.php

class UserCourse extends Model

use HasFactory;

protected $fillable = [];


public function user_course()

    return $this->belongsTo(Course::class);


【问题讨论】:

【参考方案1】:

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

您需要进行一些更正才能使其看起来符合 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 模型,因为它是一个支点

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

用户.php

public function courses()

    return $this->belongsToMany(Course::class);

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

课程.php

public function users()

    return $this->belongsToMany(User::class);

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

同样的事情来获取属于同一类的用户Course::find(1)->users

获取用户未上过的课程:

$userId = 1;
$courses = Course::whereDoesntHave('users', function($userQB) use($userId) 
    $userQB->where('id',$userId);
)->get();

【讨论】:

Course::find(1)->users 工作正常,但 User::find(1)->courses 返回 null @xMrViktorx 你修改了你的迁移吗?结构是对称的,如果一种方式有效,另一种方式也应该有效。 是的,我修改了。 @xMrViktorx 你运行这个得到结果吗? Course::find(1)->users()->first()->courses 如果是,那么一切正常,请检查您的数据库条目以获得所需的结果。 @xMrViktorx 如果您需要快速帮助,请加入聊天室chat.***.com/rooms/231603/…

以上是关于Laravel 一对多(反向)/属于返回 null的主要内容,如果未能解决你的问题,请参考以下文章

laravel 雄辩的关系一对多返回 null

Laravel 一对多关系返回 null

laravel的模型关联之(一对多的反向)

Laravel 5 删除一对多关系

SQLSTATE [42S22]:未找到列:1054 未知列一对多(反向)关系 laravel

Laravel 一对多关系和一对一关系