【问题标题】:Eloquent Relationships (Laravel 5.4)雄辩的关系(Laravel 5.4)
【发布时间】:2017-10-01 06:20:47
【问题描述】:

我正在制作一个 Laravel 5.4 应用程序,但我很难弄清楚我应该如何使用 雄辩的关系来构建我的数据。

这是我的模型以及我希望它们如何关联:

  • 学校 → 有课程、用户和活动

  • 用户 → 可以属于学校。可以上课和上课(带案例)

  • 班级 → 属于学校。有用户和主题。可以做作业

  • 主题 → 属于某个类

  • 会话 → 属于某个用户。可以有案例

  • 案例 → 属于一个会话

  • 事件 → 属于学校

  • 家庭作业 → 属于一个班级

我应该如何在我的 Laravel 5.4 项目中使用雄辩的关系函数(belongsTo、hasMany 等)来构建它?

【问题讨论】:

  • 没有口才怎么办?你试过写下数据库结构吗?
  • 你已经知道这些关系了。如果您阅读 Laravel 上的 Relationships 文档,在 Laravel 中应该很容易做到这一点。
  • 主要问题是我不知道什么时候应该使用“hasManyThrough”关系。有人可以解释什么时候使用这个吗?
  • @KristofferDamborJørgensen 可能不会。有两个原因:(1)这不是您在问题中提出的问题;(2)这是一个广泛的问题。另外,你应该保持简单,如果你更了解其他关系,它应该可以满足你的要求。
  • @Wistar - 让它变得愚蠢简单很有意义:D 外键(如 user_id 等)怎么样,我需要自己添加它们,还是 eloquent 为我这样做? :)

标签: php laravel eloquent laravel-5.4 laravel-eloquent


【解决方案1】:

假设 Class、User 和 Event 模型有一个属性 school_id 并且您要使用的主键是相应模型的 id,那么您的 Class、User、Event 和 School 模型应该如下所示。

学校

class School extends Model
{
public function users(){
    return $this->hasMany('App\User');
}

public function classes(){
    return $this->hasMany('App\Class');
}

public function sessions(){
    return $this->hasMany('App\Session');
}
}

用户

class User extends Model
{
public function school(){
    return $this->belongsTo('App\School');
}

public function classes(){
    return $this->hasMany('App\Class');
}

public function events(){
    return $this->hasMany('App\Event');
}
}

class Class extends Model
{
public function school(){
    return $this->belongsTo('App\School');
}

public function users(){
    return $this->hasMany('App\User');
}

public function subjects(){
    return $this->hasMany('App\Subject');
}
public function homeworks(){
    return $this->hasMany('App\Homework');
}
}

事件

class Class extends Model
{
public function school(){
    return $this->belongsTo('App\School');
}

}

您可以使用这些关系来定义具有链接功能的查询。例如如果您想获取与具有 id 属性等于 $id 的 School 关联的所有事件,您可以编写,

$events = App\School::find($id)->events;

Laravel Documentation 解释的很好

【讨论】:

    【解决方案2】:

    正确的做法是

    学校

    public function classes()
    {
        return $this->hasMany('App\Class');
    }
    
    public function users()
    {
        return $this->hasMany('App\User');
    }
    
    public function events()
    {
        return $this->hasMany('App\Event');
    }
    

    public function school()
    {
        return $this->belongsTo('App\School');
    }
    
    public function subjects()
    {
        return $this->hasMany('App\Subject');
    }
    
    public function homeworks()
    {
        return $this->hasMany('App\Homework');
    }
    
    
    public function users()
    {
        return $this->belongsToMany('App\User','class_users','class_id','user_id');
        // this should be many to many because users can also have many classes
    }
    

    用户

    public function school()
    {
       return $this->belongsTo('App\School');
    }
    
    public function classes()
    {
        return $this->belongsToMany('App\Class','class_users','user_id','class_id');
        // this should be many to many as explained to class
    }
    
    public function sessions()
    {
        return $this->belongsToMany('App\Session','session_users','user_id','session_id');
        // like classes do, this should be many to many relationship because sessions can also have many users
    }
    

    主题

    public function class()
    {
        return $this->belongsTo('App\Class');
    }
    

    会议

    public function users()
    {
        return $this->belongsToMany('App\User','session_users','session_id','user_id');
        // should be many to many as well
    }
    
    public function cases()
    {
        return $this->hasMany('App\Case');
    }
    

    案例

    public function session()
    {
        return $this->belongsTo('App\Session');
    }
    

    活动

    public function school()
    {
        return $this->belongsTo('App\School');
    }
    

    家庭作业

    public function class()
    {
        return $this->belongsTo('App\Class');
    }
    

    【讨论】:

      【解决方案3】:

      创建 School 模型和基础表后,就该创建关系了。打开 School 模型并创建一个名为 classes、users 和 events 的公共方法;在里面引用 hasMany 方法:

      学校:

      class School extends Model {
      
        public function classes()
        {
          return $this->hasMany('App\Class');
        }
        public function users()
        {
          return $this->hasMany('App\User');
        }
        public function events()
        {
          return $this->hasMany('App\Event');
        }
      
      }
      

      用户:

      class User extends Model {
      
          public function school(){
              return $this->belongsTo('App\School');
          }
      
          public function classes(){
              return $this->hasMany('App\Class');
          }
      
          public function sessions(){
              return $this->hasMany('App\Session');
          }
      
      }
      

      类:

      class Class extends Model {
      
          public function school(){
              return $this->belongsTo('App\School');
          }
      
          public function users(){
              return $this->hasMany('App\User');
          }
      
          public function subjects(){
              return $this->hasMany('App\Subject');
          }
      
          public function homeworks(){
              return $this->hasMany('App\Homework');
          }
      
      }
      

      主题:

      class Subject extends Model {
      
          public function class(){
              return $this->belongsTo('App\Class');
          }
      
      }
      

      会话:

      class Session extends Model {
      
          public function user(){
              return $this->belongsTo('App\User');
          }
      
          public function cases(){
              return $this->hasMany('App\Case');
          }
      
      }
      

      案例:

      class Case extends Model {
      
          public function session(){
              return $this->belongsTo('App\Session');
          }
      
      }
      

      事件:

      class Event extends Model {
      
          public function school(){
              return $this->belongsTo('App\School');
          }
      
      }
      

      家庭作业:

      class Homework extends Model {
      
          public function class(){
              return $this->belongsTo('App\Class');
          }
      
      }
      

      有关hasMany关系的更多详细信息,请查看此处的链接:EasyLaravelBook

      【讨论】:

      • 用户应该属于ToMany 类,因为类也可以有很多用户.. 这应该由一个表.. 以及会话进行透视
      猜你喜欢
      • 1970-01-01
      • 2017-10-12
      • 2018-01-11
      • 2017-10-04
      • 2015-03-14
      • 2018-11-28
      • 2015-01-11
      • 2021-06-03
      • 2020-03-26
      相关资源
      最近更新 更多