如何从Mysql和Codeigniter

时间:2017-04-26 01:59:45

标签: php mysql codeigniter

我正在为使用codeigniter框架开发的硬件商店开发销售点。

我想提出一份详细的帐户报表,如下图所示

enter image description here

我有两个表是销售和付款,我想从这两个表中获取数据,以便我可以生成特定客户的帐户报表。

这将有所帮助,因为客户可以看到他/她以现金或信用为基础购买的所有物品,并显示他们按日期分组的款项。

还可以计算到期金额。

我可以使用以下代码单独列出(销售和付款),从而计算到期金额。

销售

<?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表

销售 enter image description here

付款

enter image description here

3 个答案:

答案 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)

如果您发布salespayments表,答案会更好,更准确。您可以使用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();