【问题标题】:Laravel get model with relation's pivot conditionLaravel 获取具有关系枢轴条件的模型
【发布时间】:2017-09-25 15:13:05
【问题描述】:

我需要获取所有appeals,其中appeal_stage.expiration_date 小于NOW()

现在我有以下解决方案:

public function scopeExpired($query) {
    $query->join('appeal_stage', 'appeals.id', 'appeal_stage.appeal_id')
        ->where('appeal_stage.expiration_date', '<=', new Expression('NOW()'));
}

但结果模型转储显示连接表被识别为数据透视表:

所以,我想问一下 - 有没有更方便的方法来执行这个请求? 我的建议是以某种方式使用Illuminate\Database\Eloquent\Relations\Pivot,但我不明白,如何在这里使用 Pivot。

UPD 1

模型有下一个关系:

public function stages()
{
    return $this->belongsToMany(Stage::class)->withPivot('prolongated_count', 'expiration_date')->withTimestamps();
}

public function appeals() {
    return $this->belongsToMany(Appeal::class);
}

【问题讨论】:

  • 您的表appeal_stage 是一个数据透视表。我会尝试使用 Eloquent 关系和 wherePivot() 方法,而不是在您的范围方法中手动加入它们。
  • wherePivot() 将按条件过滤Stage,而不是Appeal
  • 您是如何定义模型中的关系的?请分享您的模型

标签: php laravel pivot laravel-eloquent laravel-5.5


【解决方案1】:

你应该可以做这样的事情:

$appeal->stages()->wherePivot('expiration_date', '<', $now)->get()

【讨论】:

  • 不,Pivot 将应用于阶段,而不是上诉。
  • 更新申诉关系到 public function Appeals() { return $this->belongsToMany(Appeal::class)->withPivot('prolongated_count', 'expiration_date')->withTimestamps(); }
  • 你的意思是 - 在舞台模型?
  • 我再次阅读了您的问题,当您正在寻找上诉时,我不明白为什么提供的答案不起作用。当您说“wherePivot 将适用于阶段,而不是上诉”时,您是什么意思?当您循环上诉并使用上述内容时,您实际上看到了什么?
  • WherePivot 方法在通过关系获取阶段时将条件应用于阶段。
【解决方案2】:

你应该在appeal模型中创建关系

public function stages()
{
   return $this->belongsToMany(Stage::class,'appeal_stage','appeal_id','stage_id')->wherePivot('expiration_date','<',Carbon::now())->withTimestamps();
}

In belongs To Many relationship 第二个参数是你的Pivot 表名

【讨论】:

  • 我应该如何获取数据透视数据?
  • 您应该在关系中添加 withPivot() 方法并在该方法中传递字段名称
  • 如果我不需要expiration_date 条件,我该怎么办?分离关系?
  • 你到底想要什么?
  • 我只想从数据透视表中获得有条件的上诉,没有阶段。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-08-18
  • 1970-01-01
  • 2014-08-17
  • 1970-01-01
  • 2019-07-05
  • 2021-01-07
相关资源
最近更新 更多