laravel - 更新整个表(Laravel 和 Vuejs)
问题描述
我在管理面板上有一个表格,其中包含 60 行和 10 列。这些列属于数据库中的 2 个不同的表。简化版是这样的:
| 资产 | 贸易 | 状态 | 代码 | 链接 |
代码和链接列包含空文本输入。当我输入任何内容时,它们的值会转到 Vue.js 对象,然后我将它们保存在 Posts 表中,它工作得很好。
Trade 和 Status 列有单选按钮,它们属于 Trades 表。当我检查单选按钮时,它们的值转到 Vue.js 对象。当我尝试更新 Trades 表时,它返回 405 错误。
该按钮调用该函数:
publish() {
this.form.post("/api/posts")
.then(() => {
this.form
.put("/api/trades")
})
.catch(() => {
//error codes...
});
}
我不知道 POST 和 PUT 请求是否可以一起使用,或者这是否是正确的语法,但我喜欢一键完成这两个操作。
我的更新功能在下面。如您所见,我正在尝试使用 Trades 表中的外键“asset_id”,而不是 Trades 表中的主键“id”。我认为这会导致问题,但我不确定。我还将那行代码添加到 Post modal 文件中,但它没有帮助:
protected $primaryKey = 'asset_id';
我的更新功能:
/**
* Update the specified resource in storage.
*
* @param \Illuminate\Http\Request $request
* @param int $asset_id
* @return \Illuminate\Http\Response
*/
public function update(Request $request, $asset_id)
{
$input = $request->all();
if (count($input['asset_id']) > 0) {
foreach ($input['asset_id'] as $asset_id) {
if (array_key_exists($asset_id, $input['status'])) {
$updates = [
'trade' => $input['trade'][$asset_id],
'status' => $input['status'][$asset_id],
'private' => (array_key_exists($asset_id, $input['public_code']) ? 0 : 1)
];
Post::where('asset_id', $asset_id)->find($asset_id)->update($updates);
}
}
}
}
当我检查单选按钮并填充输入时,Vue.js 对象变成了这样:
form: new Form([
asset_id: [2, 5, 16, 52],
trade: {
2: "Long",
5: "None",
16: "Long",
52: "Short"
},
status: {
2: "Active",
5: "Canceled",
16: "Pending"
52: "Active"
},
public_code: {
2: "VBFABVR",
16: "hmbtr46"
},
link: {
2: "http://...",
16: : "http://..."
}
])
我不确定我是否应该提供更多细节。如果是这样,请告诉我。我希望有人告诉我这里出了什么问题。
编辑:路线代码:
Route::apiResources([
'users' => 'API\UsersController',
'roles' => 'API\RolesController',
'plans' => 'API\PlansController',
'categories' => 'API\CategoriesController',
'assets' => 'API\AssetsController',
'posts' => 'API\PostsController',
'trades' => 'API\TradesController',
]);
路线清单:
| POST | api/trades | trades.store | App\Http\Controllers\API\TradesController@store | api
| GET|HEAD | api/trades | trades.index | App\Http\Controllers\API\TradesController@index | api
| PUT|PATCH | api/trades/{trade} | trades.update | App\Http\Controllers\API\TradesController@update | api
| GET|HEAD | api/trades/{trade} | trades.show | App\Http\Controllers\API\TradesController@show | api
| DELETE | api/trades/{trade} | trades.destroy | App\Http\Controllers\API\TradesController@destroy | api
解决方案
这是一个菜鸟的错误。我试图将交易集合传递到数据库,但放置请求需要 /api/trades/$id。这就是为什么我在前端创建了一个 for 循环,而在后端,我只需要一个简单的更新函数。
这是我单击提交按钮时调用的函数:
publish() {
var trades = this.form.asset_id.length;
this.form.post("/api/posts")
for (var i = 0; i < trades; i++) {
if (this.form.asset_id[i] in this.form.status) {
this.form.put("/api/trades/" + this.form.asset_id[i])
}
}
}
这是上传功能:
public function update(Request $request, $id)
{
$item = Trade::findOrFail($id);
$input = $request->all();
$updates = [
'trade' => $input['trade'][$id],
'status' => $input['status'][$id],
'private' => (array_key_exists($id, $input['public_code']) ? 0 : 1)
];
$item->update($updates);
}
推荐阅读
- java - Java logging.properties 文件只打印特定的记录器
- node.js - 如何使用 Node.js Net 发送 SMTP 消息(没有 Nodemailer)
- shiny - 如何格式化标签的部分粗体?
- ruby - 在 alpine 上构建 ruby 1.8.7
- mysql - 如何从重复记录中获取唯一记录(通过忽略前两个字符)?
- html - 为什么 Angular 控件不会隐藏?(隐藏但保留在 DOM 中以保留价值)
- jquery - 有谁知道如何让 Google Analytics Embed API 在 MVC 5 中工作?
- java - 为什么当类存在时我会得到 ClassNotFoundException
- c# - 是否有可能让 ac# 泛型方法返回具有相同字段的不同对象?
- dictionary - 当键不在地图中时,不引发错误(如 Python)有什么好处?