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的主要内容,如果未能解决你的问题,请参考以下文章