Laravel Eloquent belongsToMany()返回第一个()

时间:2018-03-01 23:03:16

标签: php laravel eloquent laravel-eloquent

我有一个Laravel 5.5应用程序,我有以下型号。

  • 工作
  • JobSheets类
  • 用户

我的用户模型与

有关系
public function jobs() {
  $this->hasMany('App\Job','user_id')->with('jobSheets');
}

我与我的乔布斯模式有关系

public function jobSheets() {
  $this->belongsToMany('App\JobSheet','jobs_jobsheets','job_id','sheet_id');
}

我试图返回所有当前登录的用户'有最新工作单的工作。

一份工作可以有很多工作单但我只想要退回最新的工作单。

我已经在我的控制器中试过了

return Auth::user()->jobs;

然而,它会针对作业返回所有作业单。

我还尝试在我的工作模式上创建另一种方法。

public function latestJobsheet()
{
  return $this->jobsheets->first();
}

并将用户模型上的jobs作业方法修改为:

public function jobs() {
  $this->hasMany('App\Job','user_id')->with('latestJobsheet');
}

但是我收到以下错误:

  

调用未定义的方法   照亮\数据库\查询\生成器:: addEagerConstraints()

3 个答案:

答案 0 :(得分:0)

假设您的jobs_jobsheets表包含id列,最好订购从最新到最旧的jobSheets。

这就是看起来的样子:

public function jobSheets()
{
  $this->belongsToMany('App\JobSheet','jobs_jobsheets','job_id','sheet_id')->orderBy('id', 'DESC');
}

如果您想限制返回的结果数量,可以将->limit($num_results)链接到belongsToMany方法的末尾

答案 1 :(得分:0)

您可以拆分BelongsToMany关系并为数据透视表(jobs_jobsheets)添加模型:

class Job {

    public function latestJobSheetPivot() {
        return $this->hasOne(App\JobSheetPivot::class)->orderBy('sheet_id', 'DESC');
    }

}

class JobSheetPivot {

    protected $table = 'jobs_jobsheets';

    public function jobSheet() {
        return $this->belongsTo(App\JobSheet::class);
    }

}

class User {

    public function jobs() {
        return $this->hasMany(App\Job::class)->with('latestJobSheetPivot.jobSheet');
    }

}

答案 2 :(得分:0)

您可以覆盖$with模型上的Job媒体资源,并急切加载关系latestJobsheet。从那里,当您访问jobs模型上的User关系时,您应该可以获得最新的工作表。如何确定最新的工作表是一个单独的问题。