【问题标题】:Remaining Balance of debit - credit using eloquent借方余额 - 使用 eloquent 贷方
【发布时间】:2018-07-06 13:48:42
【问题描述】:

我有一个带有事务的客户端数据库。 每个事务有 2 个 sql 列,DEBIT 和 CREDIT。两个都可以填,也可以只填一个。

使用 eloquent,我想要的是借方的总和 - 贷方的总和,这样我就可以得到他的余额。

事务架构如下所示:

Schema::create('transactions', function (Blueprint $table) {
          $table->increments('id');
          $table->datetime('datestamp')->nullable();;
          $table->text('reason')->nullable();;
          $table->decimal('debit')->default(0);
          $table->decimal('credit')->default(0);

          $table->integer('customerId')->unsigned();
          $table->foreign('customerId')->references('id')->on('customers');

          $table->boolean('isDeleted')->default(0);
          $table->timestamps();
      });

我的客户模型如下所示:

    <?php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class customer extends Model
{
    public function transaction()
    {
      return $this->hasMany('App\Models\transaction','customerId','id')->where("isDeleted",0)->orderBy('datestamp');
    }

}

我的交易模型是这样的:

namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class transaction extends Model
{
    public function balance()
    {
        // problem is that i dont know how to get only for specific customer
        $debit = transaction::sum('debit');
        $credit = transaction::sum('credit');
        return $debit-credit; 
    }
}

【问题讨论】:

    标签: mysql laravel eloquent


    【解决方案1】:

    您首先需要一个customer 对象,以便您可以通过您创建的关系引用他们的交易:

    $customer = customer::find(1);
    
    $transactions = $customer->transactions;
    
    $balance = $transactions->sum(function($trans){
        return $trans->debit - $trans->credit;
    });
    

    将其放入customer 模型很简单:

    class customer extends Model
    {
        public function transaction()
        {
          return $this->hasMany('App\Models\transaction','customerId','id')->where("isDeleted",0)->orderBy('datestamp');
        }
    
        public function getBalanceAttribute(){
    
            return $this->transactions->sum(function($trans){
    
                return $trans->debit - $trans->credit;
    
            });
        }
    }
    

    现在您只需使用$customer-&gt;balance即可访问客户的余额

    【讨论】:

    • 谢谢。您的解决方案虽然似乎存在于控制器中,但我想将其放置在模型中。否则我必须循环为每个客户做你的解决方案。
    • @SimosFasouliotis 简单调整以将其放置在客户模型中,请参阅编辑
    • 我不明白。在客户模型中存在 getBalanceAttribute,但您建议通过 $customer->balance 获取余额;是错字还是我不明白的地方?
    • @SimosFasouliotis 这是一个让事情变得更容易的 laravel 技巧。如果你有一个名为-&gt;getFooAttribute() 的函数,你可以使用-&gt;foo。文档:laravel.com/docs/5.6/eloquent-mutators#accessors-and-mutators
    • 感谢您的解释。我确实尝试了代码,但不幸的是 $customers (每个)不包含 balance 属性。我正在使用 $customers = customer::where('isDeleted',0)->get();我尝试添加 ->with('balance') 但产生错误。有什么想法吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多