写资料前要先有栏位,找到前面指令建立的 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 重新编译前端画面,重整,然後输入值在发送试试,成功的话可以到资料库中看看新建的资料。
接下来要将写入的资料读取出来,等下一篇吧。
>>: D19 使用分页(Paginator) - 首页跟个人文件页
先欢迎各位来到整体难度最高的领域 在听这里之前 前面的逆向组语要先学好 还有对 OS 以及计算机概论...
仔细回想一下,大概是在许多年前,就曾陆续看过 iT 邦帮忙相关广告或分享。但从没想过,这个品牌有一天...
前言 昨天谈到敏捷的重点是其背後的精神,而 Scrum 也不例外,但为什麽 Scrum 的导入还是这...
前言:介绍完了阵列和链结串列的实作之後,接着就要进入下一个主题-堆叠。那堆叠事甚麽,又有怎麽样的特性...
p5 中的 color 物件: 先认识两个色彩学 可以了解 https://www.instagra...