Php 有没有办法从另一个表中获得基于ID的嵌套的雄辩模型?

Php 有没有办法从另一个表中获得基于ID的嵌套的雄辩模型?,php,laravel,eloquent,Php,Laravel,Eloquent,嘿,这里是stackoverflow 我目前正在构建一个课程应用程序,作为我的laravel项目的一部分 我的问题在于雄辩如何处理模型关系,我对雄辩还是有点陌生,所以希望你能回答我的问题 结构 这门课程有很多集,每集都有很多部分 这意味着数据库中有3个表课程->课程集->课程集章节 class CourseEpisodeSection extends Model { protected $fillable = [ 'id', 'course_episode_id', '

嘿,这里是stackoverflow

我目前正在构建一个课程应用程序,作为我的laravel项目的一部分

我的问题在于雄辩如何处理模型关系,我对雄辩还是有点陌生,所以希望你能回答我的问题

结构

这门课程有很多集,每集都有很多部分

这意味着数据库中有3个表课程->课程集->课程集章节

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);
}
ID表是我将课程与用户连接的地方-课程\用户

现在我可以创建课程并正确地输入所有数据

问题

我需要检索用户购买的所有课程及其嵌套的子级,这些子级在课程用户表中连接,列为课程id和用户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,
                            },
                        ]
                    },
                ]

            }
模型图片

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);
}
我现在的模特

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);
        });
    });
}
课程模式

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);
}
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 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);
}
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表包含课程和用户模型之间的多对多关系。在多对多关系中,实际上不需要CourseUser模型。这种包含多对多关系的表称为透视表。阅读更多来自

我仅定义与您的课程、用户、CourseEpisode、CourseEpisodeSection模型的关系

Course.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);
  }
}
User.php

class User
{
  public function courses()
  {
    return $this->belongsToMany(Course::class,'course_users')->withPivot('active');
  }
}
如果要从用户获取所有子关系,请使用嵌套:


请发布问题中的代码,而不是链接。不要将数据库表/模型发布为图像。。。Stackoverflow支持表,否则代码为文本;复制并粘贴到问题中,格式正确。我们必须点击8个链接来查看您的问题是什么,这太多了。您可能应该考虑的一件事是模型的命名方案。您当前有一个名为
Course
CourseEpisode
的模型,但还有一个名为
courseuser
。模型应该是单数的。因此,如果我正确理解了这个问题,您希望获得所有与用户连接的
课程
s和相关的
CourseEpisode
s吗?我建议你看一下这本书。根据您的描述,您需要的一切都应该在那里。@YaakovAinspan是的,我想查看课程用户表,找到特定用户购买的所有课程。但是我需要在这个过程中得到所有的课程和嵌套的子课程。它是有效的!,非常感谢您的帮助和非常有启发性的回答。:-)