我有一个简单的待办事项应用程序,但无法同时持久化多个记录的更新。客户端版本在这里可以正常运行:http://codepen.io/anon/pen/bVVpyN
每次我执行操作时,都会向我的Laravel API发送HTTP请求以持久化数据。但是我在completeAll方法上遇到了问题。
每当我点击“全部完成”按钮时,就会执行completeAll方法:
上述的$tasks和$newTasks变量使用toArray()方法后,var_dump的结果相同。但是当我尝试更新任务时,出现了以下错误:
请就我的原始尝试提供建议,帮助我让这个简单的TodoApp工作。
或者,如果更好的话,请帮我让foreach/for循环起作用。谢谢。
应用程序现在正确地保留数据,但让我感到困扰的是,我并没有真正从客户端更新任何内容。我只是执行服务器端代码,因为我实际上没有传递任何查询。如何使用像这样的URL解决问题:
每当我点击“全部完成”按钮时,就会执行completeAll方法:
completeAll: function () {
var tasks = [];
var taskIds = [];
this.tasks = this.tasks.filter(function (task) {
task.completed = true;
tasks.push(task);
taskIds.push(task.id);
return task.completed;
});
this.$http.put('api/tasks/' + taskIds, { tasks: tasks });
},
我在这里向一个URL发送请求,它可能看起来像这样:
http://localhost:8000/api/tasks/1,3,8,4
同时,我会发送任务对象。这是来自 Chrome 开发者工具的请求有效载荷:
{tasks: [{id: 1, body: "One", completed: true, created_at: "2015-09-09 08:36:38",…},…]}
然后,在服务器端,我有一个名为 TasksController 的更新函数,代码如下:
public function update(Request $request, $id)
{
// gives ["1", "2", "3"] instead of "1,2,3" a
$taskIds = explode(",", $id);
// what happens if I update more than one task at once
// ** PROBLEMATIC SECTION **
if (count($taskIds) > 1) {
$tasks = Task::whereIn('id', $taskIds)->get()->toArray();
$newTasks = Input::get('tasks');
var_dump($tasks);
var_dump($newTasks);
/** This Line does not Work **/
Task::whereIn('id', $taskIds)->update(Input::get('tasks'));
return 'update more than one task at once';
}
// what happens if I update only one task
Task::where('id', $id)->update(Input::all());
return 'update exactly one task';
}
上述的$tasks和$newTasks变量使用toArray()方法后,var_dump的结果相同。但是当我尝试更新任务时,出现了以下错误:
preg_replace(): Parameter mismatch, pattern is a string while replacement is an array
我不确定为什么。在我看来,Task::whereIn('id', $taskIds)是一个对象而不是字符串。
到目前为止我尝试过的替代方法
使用foreach/for循环遍历$tasks数组,但我无法使其工作,因为我还必须遍历$newTasks数组进行分配,像这样:
foreach ($tasks as $task) { for ($i=0; $i < count($taskIds); $i++) { Task::where('id', $task->id)->update($newTasks[$i]) } }
在我的API上创建另一个端点,以完成每个任务,URL如下:
然后在我的TasksController上执行一个completeAll方法,将每个任务设置为已完成。但我无法让它工作,因为我得到了一个
Method not allowed exception
我不确定为什么,但我认为使用像这样的API更好地使用我的原始方法:
api/tasks/1,2,50,1,3
因为在这里建议过:https://laracasts.com/discuss/channels/code-review/vuejs-delete-multiple-tasks-each-task-one-request
请就我的原始尝试提供建议,帮助我让这个简单的TodoApp工作。
或者,如果更好的话,请帮我让foreach/for循环起作用。谢谢。
编辑
根据一个答案,建议遵循上述第2点并创建一个额外的端点。
这是我的路由:
我使用post方法向url发送请求:
http://localhost:8000/api/tasks/complete-all
通过我的app.js执行,使用以下内容:
this.$http.post('api/tasks/complete-all');
这是我改编后的TasksController:
public function completeAll(Request $request)
{
$tasks = Task::where('completed', false)->get();
foreach ($tasks as $task) {
Task::where('id', $task->id)->update(['completed' => true]);
}
return response()->json(['message' => 'All tasks completed']);
}
应用程序现在正确地保留数据,但让我感到困扰的是,我并没有真正从客户端更新任何内容。我只是执行服务器端代码,因为我实际上没有传递任何查询。如何使用像这样的URL解决问题:
http://localhost:8000/api/tasks/1,23,43,5
谢谢