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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Laravel Eloquent belongsToMany()返回第一个()相关的知识,希望对你有一定的参考价值。

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

答案

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

这是什么样子:

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

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

另一答案

您可以拆分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');
    }

}
另一答案

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

以上是关于Laravel Eloquent belongsToMany()返回第一个()的主要内容,如果未能解决你的问题,请参考以下文章

php Laravel 5 Eloquent CheatSheet #laravel #eloquent

php Laravel 5 Eloquent CheatSheet #laravel #eloquent

php [Eloquent CheatSheet] Eloquent #laravel #eloquent的常见查询方法

Laravel - Eloquent 连接

Laravel 从 Raw DB 到 Eloquent

Laravel/Eloquent 建议覆盖 trait 属性?