繁体   English   中英

雄辩模型中的更新事件不会触发

[英]Updating event is not fire in Eloquent model

我创建了一个用于更新EMI贷款金额的功能。 在此功能中,贷款金额在创建和删除EMI期间成功更新,但在EMI更新时不成功。

电磁干扰模型

    <?php namespace App;

       use Illuminate\Database\Eloquent\Model;

      class Emi extends Model {

    //
    protected  $table = 'emi';

    protected $fillable = ['loan_id', 'amount', 'description', 'date'];



    public function loan()
    {
        return $this->belongsTo('App\Loan');
    }

    public static function boot()
    {
        parent::boot();

        static::deleted(function($emi){
            $loan=\App\Loan::find($emi->loan_id);
            $loan->paid -= $emi->amount;
            $loan->balance += $emi->amount;
            $loan->save();
        });

        static::saved(function($emi){
            $loan=\App\Loan::find($emi->loan_id);

            $loan->paid += $emi->amount;
            $loan->balance -= $emi->amount;
            $loan->save();
        });

        static::updating(function($emi){

            $loan=\App\Loan::find($emi->loan_id);

            $loan->paid -= $emi->amount;
            $loan->balance += $emi->amount;
            return $loan->save();
        });


    }
  }

Emi控制器

      <?php

       namespace App\Http\Controllers\Auth;

       use Illuminate\Http\Request as Request;

        use App\Http\Requests;
       use App\Http\Controllers\Controller;
      use Validator;
      use Response;

     use App\Account;
     use App\Loan;
     use App\Emi;

     class EmiController extends Controller
     { 

          /**
 * New data validation
 * @param array $data
 * @return \Illuminate\Validation\Validator
 */
protected function validator(array $data)
{
    return Validator::make($data,[
        'loan_id'     =>'required|numeric',
        'amount'      =>'required|numeric|max:999999999999999999',
        'description' =>'required|alpha_text|max:250',
        'date'        =>'required|date',
    ]);
}

/**
 * Display a listing of the Emi resource.
 * If loan id is not given, then returns all Emi resource.
 * @param Request $request
 * @return \Illuminate\Database\Eloquent\Collection|static[]
 */

public function index(Request $request)
{
    $loan_id = $request->get('loan_id');

    //All Emi recipets for loan
    if($loan_id !==NULL)
        return Loan::find($loan_id)->emi;
    else
        return Emi::with('loan')->get();
}

/**
 * Show the form for creating a new resource.
 *
 * @return Response
 */
public function create()
{
    //
}

/**
 * Store a newly created resource in storage.
 * @param Request $request
 * @return Response
 */
public function store(Request $request)
{

    $validator = $this->validator($request->all());

    if($validator->fails()){
        return Response::json( $validator->errors()
            ,400);
    }

    $emi = new Emi($request->all());

    //TODO Loan balance update

    if($emi->save()){
        return $emi;
    }

    return Response::json( ['error' => 'Server is down']
        ,500);
}

/**
 * Display the specified resource.
 *
 * @param  int  $id
 * @return Response
 */
public function show($id)
{
    //
    return Emi::find($id);
}

/**
 * Show the form for editing the specified resource.
 *
 * @param  int  $id
 * @return Response
 */
public function edit($id)
{
    //
}

/**
 * Update the specified resource in storage.
 * @param $id
 * @param Request $request
 * @return \Illuminate\Http\JsonResponse
 */
public function update($id,Request $request)
{
    $validator = $this->validator($request->all());

    if($validator->fails()){
        return Response::json($validator->errors()
            ,400);
    }

    //TODO Update loan  balance
    $emi = Emi::find($id);
    //$emi->fill($request->all());

    if($emi->update($request->all())){
        return $emi;
    }

    return Response::json( ['error' => 'Server is down']
        ,500);
}


/**
 * Remove the specified resource from storage.
 *
 * @param  int  $id
 * @return Response
 */
public function destroy($id)
{
    //TODO delete emi balance change in loan
    if(Emi::destroy($id))
        return Response::json(array('msg'=>'Emi deleted'));
    else
        return Response::json(array('error'=>'Records not found'),400);
   }
 }

我遇到了Model事件系统的一些问题。 有时它只是行不通,而且还有一个缺点,就是您不能将所有依赖的DB操作放在事务中。

尽管有点不客气,但我认为插入/更新/删除相关模型的最可靠方法(如果要确保数据库关系完整性)是通过扩展save()和delete()方法,如下所示:

class Model extends Eloquent {

    $hasCustomInsert = false;
    $hasCustomUpdate = false;
    $hasCustomDelete = false;

    public function __construct(array $attributes = [])
    {
        parent::__construct($attributes);

        foreach(get_class_methods($this) as $method) {
            if (in_array($method,['preInsert','postInsert'])) $this->hasCustomInsert = true;
            if (in_array($method,['preEdit','postEdit'])) $this->hasCustomUpdate = true;
            if (in_array($method,['preDelete','postDelete'])) $this->hasCustomDelete = true;
        }
    }

    public function save(array $options = [])
    {
        //Custom Insert
        if (!$this->exists && $this->hasCustomInsert) {
            return DB::transaction(function() use($options) {

                $this->preInsert();
                $saved = parent::save($options);
                $this->postInsert();

                return $saved;
            });
        }

        //Custom Update
        if ($this->exists && $this->hasCustomUpdate) {
            return DB::transaction(function() use($options) {

                $this->preEdit();
                $saved = parent::save($options);
                $this->postEdit();

                return $saved;
            });
        }

        return parent::save($options);
    }

    public function delete()
    {
        //Custom Delete
        if ($this->exists && $this->hasCustomDelete) {
            return DB::transaction(function() {

                $this->preDelete();
                $deleted = parent::delete();
                $this->postDelete();

                return $deleted;
            });
        }

        return parent::delete();
    }

}

在扩展Eloquent的自定义基础Model类上使用此功能。 然后,所有模型都应从基类扩展,而不是直接扩展Eloquent。

然后,您可以在子模型的preInsert(),postInsert(),preEdit(),postEdit(),preDelete()和postDelete()方法中添加所需的内容。 如果子模型没有实现这些方法,则save()和delete()只会像往常一样调用Eloquent的方法。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM