Search code examples
databaselaraveleloquentcriteria

Restriction on duplicate entry with respect to another column entry


I have two models Member and Saving with

Member('id','name')
Saving('id','member_id','amount','month')

I have to restrict duplicate entry of saving of a member for a given month.

Member.php

class Member extends Model
{
protected $fillable=['name','address','phone']; 
public function loan()
{
    return $this->hasOne(Loan::class,'member_id','id');
}
public  function savings()
{
    return $this->hasMany(Saving::class,'member_id','id');
}
}

Saving.php

namespace App;
use Illuminate\Database\Eloquent\Model;
class Saving extends Model
{
protected $fillable=['amount','month','member_id']; 
 public function member()
{
    return $this->belongsTo('App\Member','member_id','id');
} 
}

Is it possible to implement restriction, using functions in model, or controller? EDIT: this is how i tried. SavingController.php

    public function addSaving(Request $request){
    if($request->isMethod('get')){
        $memberData = Member::all();
        return view($this->_pagePath.'saving.addsaving',compact('memberData')); 
        //return redirect()->back();
    }
    if($request->isMethod('post')){
        $this->validate($request,[
            'amount' => 'required',
            'month' => 'required'
        ]);
        $data['amount'] = $request->amount;
        $data['month'] = $request->month;
        $data['member_id']= $request->name;
        $member= Member::find(1);
        if($member->savings()->where('month',$request->month)->exists())
        {
          return 'Savings for this month are already added.';
        }
        else
        {
        if(DB::table('savings')->insert($data)){
            return redirect()->route('saving')->with('success','data was successfuly inserted');
        }
    }
                }
 }

Solution

  • An enum is a wrong column for month my friend, unless you don't care for the year. Because this way you will just be able to store savings for each month, but not for each year separately.

    Your relationship is set correctly, so you can then make a check like this:

    // considering you have the specific member selected
    $member = Member::find('ID_OF_THE_MEMBER');
    if($member->savings()->where('month', APRIL)->exists())
    {
        return 'Savings for this month are already added.';
    }