Eloquent ORM - 写入资料

建立资料

写资料前要先有栏位,找到前面指令建立的 create_todos_table migration 档案,
加上一个 name 栏位

public function up()
{
    Schema::create('todos', function (Blueprint $table) {
        $table->id();
        $table->string('name'); // 加入 name
        $table->timestamps();
    });
}

然後执行 migration

sail artisan migrate

Route::resource 会建立 POST /todo 路由,对应到 TodoController 中的 store 方法。

所以这就来改写 store() 方法,加入建立 Todo 资料的功能

//app\Http\Controllers\TodoController.php

public function store(Request $request)
{ 
    $data = $request->all(); // 取得请求中的 body 资料

    $todo = new Todo;

    $todo->name = $data['name'];

    $todo->save();
}

Eloquent 建立资料的基本方法从宣告新的 Model 实例开始

$todo = new Todo;

宣告後可以任意编辑栏位资料,这时候都还没进资料库

$todo->name = $data['name'];

最後再储存进资料库

$todo->save();

基础的建立资料方法就这样,拆成一行行的好处是可以更清晰的撰写每一栏资料的处理逻辑,不过如果不用对资料做太多处里的话,可以用 create() 方法一口气建立资料

$todo = Todo::create([
    'name' => $data['name'],
]);

create() 会直接写入资料库,写入成功後会回传该笔资料的实例。

不过 create 会用阵列一次写入多个栏位,这样子 Model 中必须定义 $fillable ,指定那些栏位可以被大量写入的方法更改,才能够用 create() 方法建立资料。

// app\Models\Todo.php

class Todo extends Model
{
    //...

    protected $fillable = [
        'name',
    ];
}

如果有定义 $fillable 但是没将栏位定义在里面,当执行像是 create() 这类方法时,会把资料中不包含在 $fillable 中的键值过滤掉,变得写不进资料库。

前端新增资料请求

後端控制器准备好之後回到前端准备发送请求,之前在 Dashboard 准备好输入框跟按钮了,就等按下按钮後对後端发送请求。

//...

import { Head, Link, useForm } from "@inertiajs/inertia-react";

//...

export default function Dashboard(props) {
    const classes = useStyles();
    const { todos } = props;
    const { data, setData, post, processing, errors, reset, transform } =
        useForm({
            todo: "",
        });

    const handleChange = (event) => {
        setData(
            event.target.name,
            event.target.type === "checkbox"
                ? event.target.checked
                : event.target.value
        );
    };

    const submit = (e) => {
        e.preventDefault();
        
        // 转换栏位名称        
        transform((data) => ({
            name: data.todo,
        }));

        // 发送请求
        post(route("todo.store"));
    };

    //...
}    

一步步来说明。

useForm 是 inertia.js 的 hook ,用来管理表单资料跟发送请求。

useForm 的 post 就是发送 post 请求到指定路由。

route("todo.store") , route 会找寻 name 符合的 route ,因为我用了 Route::resource 建立 todo 的路由,所以会有预设的 todo.store 这个 name。

这边也可以直接指定路由

post('/todo');

useForm 的 transform 可以在发送请求前将资料做映射,像这边将 todo 改为 name 才能对上後端的资料栏位名称。

完成後让 mix 重新编译前端画面,重整,然後输入值在发送试试,成功的话可以到资料库中看看新建的资料。

接下来要将写入的资料读取出来,等下一篇吧。

References

Eloquent:Getting Started

<<:  [DAY11]文字与表情符号

>>:  D19 使用分页(Paginator) - 首页跟个人文件页

Day 27 - Pwn 0x1

先欢迎各位来到整体难度最高的领域 在听这里之前 前面的逆向组语要先学好 还有对 OS 以及计算机概论...

【Day30】最後一天的回顾笔记:我们没做到,但也做到了!

仔细回想一下,大概是在许多年前,就曾陆续看过 iT 邦帮忙相关广告或分享。但从没想过,这个品牌有一天...

Scrum 也自然吗

前言 昨天谈到敏捷的重点是其背後的精神,而 Scrum 也不例外,但为什麽 Scrum 的导入还是这...

[Day09]程序菜鸟自学C++资料结构演算法 – 堆叠Stack介绍与建立

前言:介绍完了阵列和链结串列的实作之後,接着就要进入下一个主题-堆叠。那堆叠事甚麽,又有怎麽样的特性...

Day 10 - 来谈谈在P5最常用的色彩学

p5 中的 color 物件: 先认识两个色彩学 可以了解 https://www.instagra...