【问题标题】:Updating a Whole Table (Laravel and Vuejs)更新整个表(Laravel 和 Vuejs)
【发布时间】:2019-02-25 15:19:07
【问题描述】:

我在管理面板上有一个包含 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/posts”和“/api/trades”的路由代码添加到您的问题中。
  • 嗨。我照你说的做了。我还添加了交易路线列表。更新函数的 URI 是 api/trades/{trade} 但我没有传递单笔交易。我正在传递一个集合。这会是我问题的根源吗?

标签: laravel vue.js


【解决方案1】:

这是一个菜鸟的错误。我试图将交易集合传递到数据库,但放置请求需要 /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);
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-05
    • 1970-01-01
    • 2019-09-05
    相关资源
    最近更新 更多