kik*_*yu1 5 php mysql codeigniter
我正在为使用codeigniter框架开发的硬件商店的销售点工作.
我想提出一份详细的账户说明,如下图所示
我有两个表是销售和付款,我想从这两个表中获取数据,以便我可以生成特定客户的帐户报表.
这将有所帮助,因为客户能够以现金或信用为基础查看他/她购买的所有物品,并且还显示他们按日期分组的付款额.
还可以计算到期金额.
我可以使用以下代码单独列出(销售和付款),从而计算到期金额.
销售
<?php
$salestotal = 0;
if (is_array($sales) || is_object($sales))
{
foreach ($sales as $key=>$sale): {?>
<tr>
<td>
<?php echo $sale->date; ?>
</td>
<td>
<?php echo $sale->id; ?>
</td>
<td>
<?php echo $sale->grand_total; ?>
</td>
<td>
<?php echo $sale->paid; ?>
</td>
<td></td>
</tr>
<?php
if(isset($sale->grand_total))
$salestotal += $sale->grand_total;
} endforeach ; }?>Run Code Online (Sandbox Code Playgroud)
支付
<?php
$paymentstotal = 0;
if (is_array($payments) || is_object($payments))
{
foreach ($payments as $key=>$payment): {?>
<tr>
<td>
<?php echo $payment->date; ?>
</td>
<td class="text-center">
<?php echo $payment->sale_id; ?>
</td>
<td class="text-center">
<?php echo $payment->paid_by; ?>
</td>
<td class="text-center">
<?php echo $payment->cheque_no; ?>
</td>
<td class="text-center">
<?php echo $payment->amount; ?>
</td>
<td class="text-center">
<?php echo $this->customers_model->getUserna($payment->created_by); ?>
</td>
<td class="text-center">
<?php echo $payment->pos_paid; ?>
</td>
<td class="text-center">
<?php echo $payment->pos_balance; ?>
</td>
<td class="text-right">
<?php echo $this->customers_model->getStorename($payment->store_id); ?>
</td>
</tr>
<?php
if(isset($payment->amount))
$paymentstotal += $payment->amount;
} endforeach ;}?>Run Code Online (Sandbox Code Playgroud)
我的控制器
function statement($id = NULL)
{
if (!$this->Admin) {
$this->session->set_flashdata('error', $this->lang->line('access_denied'));
redirect('pos');
}
if($this->input->get('id')) { $id = $this->input->get('id', TRUE); }
$this->data['sales'] = $this->customers_model->getSales($id);
$this->data['payments'] = $this->customers_model->getPayments($id);
$this->data['customer'] = $this->customers_model->getCustomername($id);
$this->data['customer_id'] = $id;
$this->page_cons('customers/statement', $this->data);
}Run Code Online (Sandbox Code Playgroud)
我的模特
public function getSales($id)
{
$q = $this->db->get_where('sales', array('customer_id' => $id));
if( $q->num_rows() > 0 ) {
return $q->result();
}
return FALSE;
}
public function getPayments($id)
{
$q = $this->db->get_where('payments', array('customer_id' => $id));
if( $q->num_rows() > 0 ) {
return $q->result();
}
return FALSE;
}Run Code Online (Sandbox Code Playgroud)
我如何组合这两个表?
我希望我对这个问题很清楚,我一直在尝试谷歌,但我没有运气.
我将不胜感激任何帮助.谢谢
编辑
MYSQL表
支付
您可以重用给定的方法getSales()并getPayments()在新方法中getSalesWithPayments()组合两个结果:
public function getSalesWithPayments($customerId) {
$sales = [];
foreach ($this->getSales($customerId) as $sale) {
$sale->payment = null;
$sales[$sale->id] = $sale;
}
foreach ($this->getPayments($customerId) as $payment) {
$sales[$payment->sale_id]->payment = $payment;
}
return $sales;
}
Run Code Online (Sandbox Code Playgroud)
在第一个循环中,您初始化$sale->payment(对于销售尚未付款的情况)并填充$sales由列索引的数组id。这样您就可以通过 ID 轻松访问任何销售,而无需进行昂贵的搜索。
在第二个循环中,您将付款分配给相应的销售额。
请注意,您可能需要添加逻辑来处理空结果(如果您只返回空数组而不是 ,则不需要FALSE)。
您现在可以像使用它一样..
控制器:
$this->data['sales'] = $this->customers_model->getSalesWithPayments($id);
Run Code Online (Sandbox Code Playgroud)
看法:
<?php foreach ($sales as $sale): ?>
<tr>
<td><?php echo $sale->date; ?></td>
<td><?php echo $sale->id; ?></td>
...
<?php if($sale->payment !== null): ?>
<td><?php echo $sale->payment->date; ?></td>
<td><?php echo $sale->payment->amount; ?></td>
...
<?php else: // empty cells if no payment ?>
<td></td>
<td></td>
...
<?php endif; ?>
</tr>
<?php endforeach; ?>
Run Code Online (Sandbox Code Playgroud)