繁体   English   中英

有没有办法根据另一个表的 id 获取嵌套的 Eloquent model ?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM