在"属于多"关系中按透视值搜索项目



我得到了这些模型:

  • Order
  • Invoice

一个Order可以有多个Invoice,一个Invoice可以属于许多Order

例:

订单:

  • 订单 #1
  • 订单 #2
  • 订单 #3

发票:

  • 发票 #1 ->属于Order #1Order #2(因此此Invoice包含两个Order(
  • 发票 #2 ->属于Order #2Order #3

每个belongsTo关系都将一个date保存为透视,该透视表定义了此订单开票的最后日期。

现在我想为我的订单模型创建一个isInvoiceable()getter,无论订单是否在上个月开具发票,它都会返回。如果最近一次date超过一个月,请true退货,因为此订单应创建新发票。

所以现在我需要你的帮助:我需要检查所有发票,是否有具有当前Orderorder_idOrder(属于ToMany(,以及比现在旧的date枢轴 - 一个月。我需要检查order_id,因为Invoice也可能包含有关其他Order的信息。

这是我缺少的链接:如何检查InvoicebelongsToMany关系的dateorder_id

假设您已将关系定义为"发票",您可以执行以下操作:

class Order extends Model {
...

public function isInvoiceable(){
$lastInvoiceDate = (date('Y-m-d', $this->invoices()->latest()->created_at));
$today = new Carbon(date('Y-m-d', strtotime(Input::get('startdate'))));
$diff_months = $lastInvoiceDate->diff($today)->months;
return $diff_months < 1;
}

有一个wherePivot方法,它应该做你想做的事。

从文档中:

通过中间表列过滤关系:

您还可以使用 wherePivot, wherePivotIn, and wherePivotNotIn 方法定义时 关系:

return $this->belongsToMany('AppRole')->wherePivot('approved', 1);
return $this->belongsToMany('AppRole')->wherePivotIn('priority', [1, 2]);
return $this->belongsToMany('AppRole')->wherePivotNotIn('priority', [1, 2]);

我还没有测试过它,但你应该能够做这样的事情:

public function isInvoiceable()
{
// replace 'invoices()' with your relationship
if ($this->invoices()->wherePivot('date', '>=', Carbon::now()->subMonth())->count() > 0) {
return false;
}
return true;
}

您有两种选择:

1-就像Remul在他的回答中所说的那样:使用wherePivot((;

2- 使用 newPivotQuery((

女巫给你更多的工作空间...

当您使用此方法时,查询将直接在数据透视表上...

class Order extends Model {

public function isInvoiceable()
{
return $this->invoices()-> newPivotQuery()->firstWhere('date', '>=', Carbon::now()->subMonth())!=null;
}

使用 newPivotQuery(( 的优势在于您可以插入、更新、进行整体查询......

最新更新