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

问题描述 投票:0回答:3

我有一个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();
}

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

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

但是我收到以下错误:

调用未定义的方法Illuminate \ Database \ Query \ Builder :: addEagerConstraints()

php laravel eloquent laravel-eloquent
3个回答
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方法的末尾


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');
    }

}

0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.