我的Laravel应用程序中有几个表,一个叫发货,另一个叫payment_distributions。
在我的货物中,我有名为pro_number和balance的列。
在我的payments_distributions中,我有一个名为shipment_id和amount的列。
现在我有一个控制器,里面有这部分代码:
}elseif($_GET['paymentStatus']=="Unpaid"){
if(empty($_GET['pro_number'])){
$shipment = NULL;
}else{
$shipment = $_GET['pro_number'];
}
if($_GET['startDate']){
$startDate = $_GET['startDate'];
}
if($_GET['endDate']){
$endDate = $_GET['endDate'];
}
$start = $_GET['startDate'];
$end = $_GET['endDate'];
$status = $_GET['paymentStatus'];
$date = \Carbon\Carbon::today()->subDays(0);
$shipments = Shipment::sortable()
->where([
['due_date','<=',date($date)],
['pro_number', 'LIKE', '%' . $shipment . '%'],
['balance','>','SELECT SUM(payments_distributions.amount) FROM payments_distributions WHERE payments_distributions.shipment_id = pro_number'],
])
->whereBetween('date', [$startDate, $endDate])
->whereNotIn('shipment_billing_status', [2,3])
->paginate(25);
return view('shipments.accounts', compact('shipments','start','end','status'));
}
现在我的问题出现了,如果我将它放入MYSQL中,以下代码可以工作:
SELECT SUM(payments_distributions.amount) FROM payments_distributions WHERE payments_distributions.shipment_id = 214050
将返回SUM(payments_distributions.amount):300.00
所以,如果你去我的代码中的行,这是唯一不起作用的东西,所以如果可以的话,这行代码是否适合所有人?我想说的是,货运行中的余额字段必须大于payment_distributions表中amount字段的总和,其中payment_distributions表中的shipment_id字段等于货件表中的pro_number字段。
['balance','>','SELECT SUM(payments_distributions.amount) FROM payments_distributions WHERE payments_distributions.shipment_id = pro_number'],
]
public function accountsQuery(){
if(($_GET['paymentStatus'] == "No Settle") or ($_GET['paymentStatus'] == "No Charge")){
if($_GET['paymentStatus'] == "No Settle"){
$status = 3;
}elseif($_GET['paymentStatus'] == "No Charge"){
$status = 2;
}
if(empty($_GET['pro_number'])){
$shipment = NULL;
}else{
$shipment = $_GET['pro_number'];
}
if($_GET['startDate']){
$startDate = $_GET['startDate'];
}
if($_GET['endDate']){
$endDate = $_GET['endDate'];
}
$start = $_GET['startDate'];
$end = $_GET['endDate'];
$status = $_GET['paymentStatus'];
$shipments = \App\Shipment::sortable()->where([
['pro_number', 'LIKE', '%' . $shipment . '%'],
['shipment_billing_status', 'LIKE', '%' . $status . '%'],
])
->whereBetween('date', [$startDate, $endDate])
->paginate(25);
return view('shipments.accounts', compact('shipments','start','end','status'));
}elseif($_GET['paymentStatus']=="Billed"){
if(empty($_GET['pro_number'])){
$shipment = NULL;
}else{
$shipment = $_GET['pro_number'];
}
if($_GET['startDate']){
$startDate = $_GET['startDate'];
}
if($_GET['endDate']){
$endDate = $_GET['endDate'];
}
$start = $_GET['startDate'];
$end = $_GET['endDate'];
$status = $_GET['paymentStatus'];
$date = \Carbon\Carbon::today()->subDays(30);
//AND TO MENTION WHERE SUM OF PAYMENTS TO THIS SHIPMENT < BALANCE DUE
$shipments = Shipment::sortable()
->where([
['date','>=', date($date)],
['pro_number', 'LIKE', '%' . $shipment . '%'],
])
->whereBetween('date', [$startDate, $endDate])
->paginate(25);
return view('shipments.accounts', compact('shipments','start','end','status'));
}elseif($_GET['paymentStatus']=="Unpaid"){
if(empty($_GET['pro_number'])){
$shipment = NULL;
}else{
$shipment = $_GET['pro_number'];
}
if($_GET['startDate']){
$startDate = $_GET['startDate'];
}
if($_GET['endDate']){
$endDate = $_GET['endDate'];
}
$start = $_GET['startDate'];
$end = $_GET['endDate'];
$status = $_GET['paymentStatus'];
$date = \Carbon\Carbon::today()->subDays(0);
$shipments = Shipment::sortable()
->where([
['due_date','<=',date($date)],
['pro_number', 'LIKE', '%' . $shipment . '%'],
])
->whereRaw('balance > SELECT SUM(p.amount) FROM payments_distributions p WHERE p.shipment_id = pro_number')
->whereBetween('date', [$startDate, $endDate])
->whereNotIn('shipment_billing_status', [2,3])
->paginate(25);
return view('shipments.accounts', compact('shipments','start','end','status'));
}
}
您应该能够将该子查询用作whereRaw
表达式的一部分:
->where([
['due_date','<=',date($date)],
['pro_number', 'LIKE', '%' . $shipment . '%']])
->whereRaw('balance > SELECT SUM(p.amount) FROM payments_distributions p WHERE p.shipment_id = pro_number')
->whereBetween('date', [$startDate, $endDate])
...
但是,我怀疑我们可能会重写您的查询以废除WHERE
子句中的相关子查询。