【问题标题】:Laravel relationships confusionLaravel 关系混乱
【发布时间】:2019-02-14 21:30:27
【问题描述】:

我最近在学习 Laravel,想创建一些表格、模型和其他东西。

我有公司、工作和员工。如果我理解正确,模型文件中的公共函数是字段:

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

这是否意味着我可以像这样为currentJob 创建另一个函数:

 public function currentJob()
  {
    return $this->hasOne('App\Job');
  }

另外,我需要为每个关系添加belongsTo 吗?比如在用户模型中?

【问题讨论】:

  • 如果你想让用户反对任何工作,那么你需要在用户模型中添加belongsTo关系
  • @merko 查看docs
  • 其实 Laravel 帮不了你,如果你不了解数据库关系的基础知识,你应该先学习。

标签: php database laravel reference


【解决方案1】:

尝试在English 中查看它而不是在PHP 中查看它,这样您就可以在正确的地方使用正确的功能。

所以你有 3 个表:company、jobs 和 employees

现在,在您深入了解 Laravel 中的模型之前,您需要了解这三个表之间的关系。

我假设公司和工作之间的关系是一对多的,这意味着一家公司可以有很多工作。

工作和员工之间的关系是一对一的,因为一份工作可以分配给一名员工。

现在根据您的项目,这些关系可能会有所不同,但第一步是建立三个表之间的关系。

现在,假设您确实具有我上面解释的相同关系,您的模型将具有以下“公共”功能:

//Company Model

//this function will returns all the jobs associated with the specific company_id
public function jobs()
{
   return $this->hasMany('App\Job');
}

========

//Job Model

//this function will return the employee associated with the specific job_id
public function employee()
{
   return $this->hasOne('App\Employee');
}

//now you can also have a function to fetch the company to which the job "belongs to", this is a reverse case which means, the jobs table has "company_id"

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

您也可以在员工模型中执行相同的操作,因为每个员工都属于一个工作意味着有一个 job_id,因此您将使用 belongsTo 关系:

//Employee Model

    //now you can also have a function to fetch the job to which the employee "belongs to", this is a reverse case which means, the employees table has "job_id"

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

需要注意的一点是 hasOne 和 belongsTo 是相互对应的函数。

因此,如果 Job 模型使用 hasOne 作为 Employee,Employee 将使用 belongsTo 作为 Job,考虑到雇员表有“job_id”作为外键。重要的是您使用的是哪个模型,基于您可以使用这些函数获取另一个模型的详细信息。

更多详情当然可以参考official documentation我希望它能帮助你消除困惑

【讨论】:

  • 我可以有多个字段,例如currentJobpreviousJobs,都引用工作模型吗?
  • 想想currentJobpreviousJobs 会返回什么?你想达到什么目的?
  • 我希望将当前工作与以前的工作分开。另外,我将如何使用工作模型作为参考,我不想在那里传递公司 ID,我尝试过但它正在寻找公司 ID。
  • 没有foreign_key就不能建立关系,这是对数据库的基本理解。你可以在任何模型中制作你喜欢的任何功能,让它做你想做的任何事情,但这不属于 Laravel 关系问题的范畴,所以请单独提出。一个问题,您清楚地说明您的目标以及您尝试实现的目标,否则人们会将您的帖子与 laravel 关系误解混淆
【解决方案2】:

对于基本模型关系:

// Job Model

public function employee(){
    return $this->belongsTo('App\Employee');

}

// Employee Model
public function jobs(){
   return $this->hasMany('App\Job');
}

如果您想获得当前工作,可以添加appended property

// Employee Model

protected $appends = ['current_job'];

//Then create function for  the same : 

public function getCurrentJob()
{
  return $this->jobs()->latest()->first();
}

【讨论】:

  • 这个答案得到了赞成,这很奇怪,因为当函数的名称是雇员时,它显示从 Job 模型返回 App\Job 所以基本上当你从控制器调用 employee() 时,它会返回工作? :) job() 函数也是如此,这对你们有意义吗?对我来说,这更像是更令人困惑和不正确的,仍然没有投票:) 也许其他人知道得更好
  • 你纠正了你的答案,干得好,你至少可以说声谢谢:)
  • 谢谢,我的错,我一发现我写的时候搞砸了,我就从手机上纠正了它
  • 没问题..没问题:)
猜你喜欢
  • 2011-07-26
  • 1970-01-01
  • 1970-01-01
  • 2023-03-16
  • 1970-01-01
  • 2021-02-22
  • 1970-01-01
  • 1970-01-01
  • 2012-02-20
相关资源
最近更新 更多