【问题标题】:Form didn't insert data to database properly [Laravel][Eloquent]表单没有正确地将数据插入数据库 [Laravel][Eloquent]
【发布时间】:2021-11-16 19:11:14
【问题描述】:

我的代码在某处出现问题,导致我的数据 $request 只是没有传递到我的数据库表(?),我不确定问题出在哪里,但每次我尝试提交它时只是重定向回来到我的创建刀片视图。
但是当我使用 dd($request->all()); 调试它时,它拥有所需的一切。
我的表有 5 列,id, book_id, member_id, user_id, borrow_date, return_date

我的模特

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');
}

我的创建控制器

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');
}

我的创建视图

<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-&gt;all());

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

谢谢!对不起,如果我的英语和解释不好

【问题讨论】:

    标签: laravel eloquent laravel-4


    【解决方案1】:

    您正在尝试验证您的$request 中的user_idstatus 存在,但它当然没有。

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

    您将Auth::user()-&gt;id 用作user_id,但它不在$request

    所以,只需从验证中删除 'user_id' =&gt; 'required',。您的$request 中也没有status,因此您也需要将其删除。应该是这样的;

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

    【讨论】:

    • 我试过你的答案它不起作用先生。它仍然没有将数据传递给我的表
    • @SomeRandomCode 你能把它改成广告$request-&gt;validate(['book_id' =&gt; ...]) 并放置一个&lt;?php $errors-&gt;any() ? var_dump($errors-&gt;all()) : echo 'no error' ?&gt; 看看是什么错误将你重定向到后面。
    • 哎呀,它就像一个魅力对不起哈哈。我忘记删除'status' =&gt; 'required'。无论如何,谢谢!
    【解决方案2】:

    在 Peminjaman 模型中使用可填充对象

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

    【讨论】:

    • $fillable 不是和 $guarded 一样吗?哦,好像我忘了把 Peminjaman 编辑成英语哈哈
    • $guarded 你不能将它批量分配给模型,但在 $filable 你可以将它批量分配给模型
    【解决方案3】:

    尝试从验证中删除 user_idstatus,请求没有这些参数,并且您正在将它们作为必需值进行验证。

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

    【讨论】:

    • 是的,只需从验证中删除这两个即可,谢谢!
    • @SomeRandomCode 那么您的问题是错误的,因为您在dd()时说“它拥有所需的一切”
    【解决方案4】:

    当使用create() 方法时,您使用的是所谓的大规模分配。根据文档https://laravel.com/docs/8.x/eloquent#mass-assignment

    ...在使用 create 方法之前,您需要指定一个 模型类上的可填充或受保护的属性。这些属性是 需要,因为所有 Eloquent 模型都受到质量保护 默认分配漏洞。

    这么说,你有两个选择:

    1 - 继续使用 create() 方法,但在模型中定义 fillable 属性

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

    2 - 使用save() 方法,无需定义fillable 属性:

    $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();
    

    【讨论】:

      猜你喜欢
      • 2017-07-24
      • 2019-05-25
      • 2019-06-24
      • 2015-09-19
      • 2014-11-02
      • 2016-06-30
      • 2018-07-09
      • 1970-01-01
      • 2020-07-05
      相关资源
      最近更新 更多