Home > database >  Form didn't insert data to database properly [Laravel][Eloquent]
Form didn't insert data to database properly [Laravel][Eloquent]

Time:09-23

I have problem with my code somewhere that make my data $request just didn't passed to my database table (?), I'm not sure what the problem is but every time I try to submit it just redirect back to my create blade view.
But when I debug it using dd($request->all()); it have everything it need.
My table have 5 columns, id, book_id, member_id, user_id, borrow_date, return_date

My Model

protected $table = "borrow";
protected $guarded = [];
public $timestamps = false;

// Relationship Book
public function book()
{
    return $this->belongsTo('App\Book');
}

// Relationship Member
public function member()
{
    return $this->belongsTo('App\Member');
}

My Create Controller

public function create()
{
    $book= Book::all();
    $member= Member::all();
    return view('borrow.create', compact('book', 'member'));
}

public function store(Request $request)
{
    $this->validate($request,[
        'book_id' => 'required',
        'member_id' => 'required',
        'user_id' => 'required',
        'borrow_date' => 'required',
        'return_date' => 'required',
        'status' => 'required'
    ]);
    Borrow::create([
        'book_id' => $request->book_id,
        'member_id' => $request->member_id,
        'user_id' => Auth::user()->id,
        'borrow_date' => $request->borrow_date,
        'return_date' => $request->return_date,
        'status' => 'borrowed',
    ]); return redirect('/borrow');
}

My Create View

<form action="/borrow" method="POST">
                            @csrf
                            <div class="form-group row">
                                <label class="col-sm-2 col-form-label">Book</label>
                                <div class="col-sm-10">
                                    <select data-placeholder="Enter Book Data"
                                        data-allow-clear="1" name="book_id" id="book_id">
                                        <option></option>
                                        @foreach($book as $value)
                                        <option value="{{ $value->id }}">ISBN {{ $value->isbn }} -
                                            {{ $value->title }} ({{ $value->year }})
                                        </option>
                                        @endforeach
                                    </select>
                                </div>
                            </div>
                            <div class="form-group row">
                                <label class="col-sm-2 col-form-label">Member</label>
                                <div class="col-sm-10">
                                    <select data-placeholder="Enter Member Data"
                                        data-allow-clear="1" name="member_id" id="member_id">
                                        <option></option>
                                        @foreach($member as $value)
                                        <option value="{{ $value->id }}">{{ $value->name }}
                                            @if ($value->gender == 'man')
                                            (M) -
                                            @else
                                            (W) -
                                            @endif
                                            {{ $value->phone }}
                                        </option>
                                        @endforeach
                                    </select>
                                </div>
                            </div>
                            <div class="form-group row">
                                <label class="col-sm-2 col-form-label">Borrow Date</label>
                                <div class="col-sm-10">
                                    <input type="date" class="form-control" name="borrow_date"
                                        id="borrow_date">
                                </div>
                            </div>
                            <div class="form-group row">
                                <label class="col-sm-2 col-form-label">Return Date</label>
                                <div class="col-sm-10">
                                    <input type="date" class="form-control" name="return_date"
                                        id="return_date">
                                </div>
                            </div>
                            <button type="submit" class="btn btn-primary">Add</button>
                        </form>

dd($request->all());

array:5 [▼
  "_token" => "pN3PPQGpT4jmLln59tY3HBiLj27fWgf65ioIYlv0"
  "book_id" => "99"
  "member_id" => "99"
  "borrow_date" => "2021-09-01"
  "return_date" => "2021-09-30"
]

Thanks! Sorry if my English and explanation is bad

CodePudding user response:

Use fillable in Peminjaman model

protected $fillable = [
      'id', 'book_id', 'member_id', 'user_id', 'borrow_date', 'return_date'
    ];

CodePudding user response:

try to remove user_id and status from the validation, the request doesn't have these parameters, and you are validating them as required values.

$this->validate($request,[
    'book_id' => 'required',
    'member_id' => 'required',
    'borrow_date' => 'required',
    'return_date' => 'required',
]);

CodePudding user response:

When using the create() method, you are using what is called massive assignment. As per docs https://laravel.com/docs/8.x/eloquent#mass-assignment:

...before using the create method, you will need to specify either a fillable or guarded property on your model class. These properties are required because all Eloquent models are protected against mass assignment vulnerabilities by default.

Saying that, you have 2 options:

1 - Keep using create() method but define fillable property in your model

protected $fillable = ['id', 'book_id', 'member_id', 'user_id', 'borrow_date', 'return_date'];

2 - Use the save() method with not need to define fillable property:

$borrow = new Borrow();
$borrow->book_id = $request->book_id;
$borrow->member_id = $request->member_id;
$borrow->user_id = Auth::user()->id;
$borrow->borrow_date = $request->borrow_date;
$borrow->return_date = $request->return_date;
$borrow->status = 'borrowed';
$borrow->save();

CodePudding user response:

You are trying to validate a user_id and a status presents in your $request but of course it doesn't.

$this->validate($request,[
        'book_id' => 'required',
        'member_id' => 'required',
        'user_id' => 'required',
        'borrow_date' => 'required',
        'return_date' => 'required',
        'status' => 'required'
    ]);

You are using Auth::user()->id as user_id and it isn't in $request

So, just remove 'user_id' => 'required', from validation. You also don't have status in your $request so you need to remove it too. It should be like this;

$this->validate($request,[
        'book_id' => 'required',
        'member_id' => 'required',
        'borrow_date' => 'required',
        'return_date' => 'required',
    ]);
  • Related