【问题标题】:Laravel Eloquent belongsToMany() return first()Laravel Eloquent belongsToMany() return first()
【发布时间】:2018-08-10 03:16:50
【问题描述】:

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

  • 工作
  • 工作表
  • 用户

我的用户模型有一个关系

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()

【问题讨论】:

  • 如何确定最新的工作表?最高 id?
  • 您能否就答案提供反馈?
  • @Dev.Wol 你有没有办法只得到第一个工作表?

标签: php laravel eloquent laravel-eloquent


【解决方案1】:

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

【讨论】:

  • 请提供代码示例?
【解决方案2】:

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

}

【讨论】:

    【解决方案3】:

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

    这就是它的样子:

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

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

    【讨论】:

    • limit() 中断预加载。
    猜你喜欢
    • 2015-06-17
    • 2017-02-04
    • 1970-01-01
    • 2019-10-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-30
    相关资源
    最近更新 更多