如何从Mysql和Codeigniter中的两个表中获取数据

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表

销售 在此输入图像描述

支付

在此输入图像描述

Pau*_*gel 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;
}
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)