[英]Is there a way to get a nested Eloquent model based on ids from another table?
嘿那里stackoverflow
我目前正在构建一个课程应用程序,作为我的 laravel 项目的一部分。
我的问题在于 eloquent 如何处理 model 关系,我对 eloquent 还是有点陌生,所以希望你能回答我的问题。
结构
该课程有很多集,每集都有很多部分。
这意味着我在数据库中有 3 个表。 课程 -> course_episodes -> course_episode_sections
ID 表是我将课程与用户联系起来的地方 - course_users 。
现在我可以创建课程并正确输入所有数据。
问题
我需要检索用户购买的所有课程及其嵌套子项,这些子项在course_users表中与course_id 和 user_id列连接
课程结构
DB中的相同结构
course: {
name: null,
sub_title: null,
estimate: null,
trailer: null,
type: null,
text: null,
course_episodes: [
{
name: null,
section: [
{
order: null,
type: null,
content: null,
},
]
},
]
}
Model 图片
我现在的模型。
class CourseUsers extends Model {
protected $fillable = [
'id',
'course_id',
'user_id',
'active',
];
protected $hidden = [
'deleted_at',
'updated_at',
'deleted_at'
];
public function courses()
{
return $this->belongsToMany(Course::class);
}
public function user(){
return $this->belongsTo(User::class);
}
public function scopeFindForUserId($query, $userId)
{
return $query->where(function ($q) use ($userId) {
$q->where(function ($q) use ($userId) {
$q->where('user_id', $userId);
});
});
}
课程 model
class Course extends Model{
protected $fillable = [
'id',
'name',
'sub_title',
'type',
'estimate',
'trailer',
'gateway_id',
'text',
'active',
];
protected $hidden = [
'deleted_at',
'updated_at',
'deleted_at'
];
public function courseEpisode()
{
return $this->hasMany(CourseEpisode::class);
}
public function courseUsers() {
return $this->hasMany(CourseUsers::class);
}
public function scopeActive(Builder $builder)
{
return $builder->where('active', true);
}
课程集 Model
class CourseEpisode extends Model implements HasMedia {
use HasMediaTrait;
protected $fillable = [
'id',
'course_id',
'order',
'name',
];
protected $hidden = [
'deleted_at',
'updated_at',
'deleted_at'
];
public function course()
{
return $this->belongsTo(Course::class);
}
public function courseSection()
{
return $this->hasMany(CourseEpisodeSection::class);
}
课程情节部分
class CourseEpisodeSection extends Model {
protected $fillable = [
'id',
'course_episode_id',
'order',
'type',
'content'
];
protected $hidden = [
'deleted_at',
'updated_at',
'deleted_at'
];
public function courseEpisode()
{
return $this->belongsTo(CourseEpisode::class);
}
根据您的解释, course_users 表包含 Course 和 User model 之间的多对多关系。 在多对多关系的情况下,您实际上不需要 CourseUser model。 这种持有多对多关系的表称为pivot表。 从官方文档中阅读更多信息
我只定义与您的 Course、User、CourseEpisode、CourseEpisodeSection 模型的关系。
课程.php
class Course extends Model
{
public function courseEpisodes()
{
return $this->hasMany(CourseEpisode::class);
}
public function users()
{
return $this->belongsToMany(User::class,'course_users')->withPivot('active');
}
}
CourseEpisode.php
class CourseEpisode extends Model
{
public function courseSections()
{
return $this->hasMany(CourseSection::class);
}
}
用户.php
class User
{
public function courses()
{
return $this->belongsToMany(Course::class,'course_users')->withPivot('active');
}
}
如果您想从用户那里获取所有子关系,请使用嵌套预加载:
$user_with_nested_course_data = User::with('courses.courseEpisodes.courseSections')->find($id);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.