我得到了这些模型:
Order
Invoice
一个Order
可以有多个Invoice
,一个Invoice
可以属于许多Order
。
例:
订单:
- 订单 #1
- 订单 #2
- 订单 #3
发票:
- 发票 #1 ->属于
Order #1
和Order #2
(因此此Invoice
包含两个Order
( - 发票 #2 ->属于
Order #2
和Order #3
每个belongsTo
关系都将一个date
保存为透视,该透视表定义了此订单开票的最后日期。
现在我想为我的订单模型创建一个isInvoiceable()
getter,无论订单是否在上个月开具发票,它都会返回。如果最近一次date
超过一个月,请true
退货,因为此订单应创建新发票。
所以现在我需要你的帮助:我需要检查所有发票,是否有具有当前Order
order_id
的Order
(属于ToMany(,以及比现在旧的date
枢轴 - 一个月。我需要检查order_id
,因为Invoice
也可能包含有关其他Order
的信息。
这是我缺少的链接:如何检查Invoice
中belongsToMany
关系的date
和order_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(( 的优势在于您可以插入、更新、进行整体查询......