我正在为使用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 ; }?>
付款
<?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 ;}?>
我的控制器
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);
}
我的模特
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;
}
如何组合这两个表?
我希望我对这个问题很清楚,我一直在尝试谷歌,但我没有运气。
我将不胜感激任何帮助。感谢
修改
MYSQL表
付款
答案 0 :(得分:1)
您可以在新方法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;
}
在第一个循环中,您初始化$sale->payment
(对于销售尚未付款的情况)并填充$sales
数组,该数组由id
列编制索引。通过这种方式,您无需昂贵的搜索即可轻松访问其ID。
在第二个循环中,您将付款分配给相应的销售。
请注意,您可能需要添加逻辑来处理空结果(如果您只返回一个空数组而不是FALSE
,则不需要这样做。)
您现在可以像..一样使用它。
控制器:
$this->data['sales'] = $this->customers_model->getSalesWithPayments($id);
查看:
<?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; ?>
答案 1 :(得分:0)
如果您发布sales
和payments
表,答案会更好,更准确。您可以使用MySQL Join从2个表中获取组合数据。
答案 2 :(得分:0)
试试这个:
$this->db->select('*')
->from('sales')
->join('payments', 'payments.sales_id = sales.id', 'right')
->where(array('sales.customer_id' => $id));
$results = $this->db->get();