【问题标题】:Laravel -request fails mySQL updateLaravel -request 使 mySQL 更新失败
【发布时间】:2020-07-21 10:43:20
【问题描述】:

问题是这样的:每一行都有一个表格。使用数据表创建:

{
    "data": null,
    "targets": -1,
    "defaultContent": "<form action='start-data-submit'> <input  name=\"prod_barcode\" />"
},
{
    "data": null,
    "targets": -1,
    "defaultContent": " <input name=\"prod_quantity\"/>"
},
{
    "data": null,
    "targets": -1,
    "defaultContent": " <input name=\"prod_price\" />"
},
{
    "data": "id",
    "visible": false,
    "searchable": false
},
{
    "data": "updated_at",
    "visible": false,
    "searchable": false
},
{
    "data": null,
    "defaultContent": " <button name=\"submit\" >Update</button> </form>"
}

在表单中单击时,将处理以下内容:


$('#start-data tbody').on('click', 'button', function () { //click update
            var row = $(this).closest('tr');
            var data = table.row(row).data().id;
            var info = table.row(row).$("input[name='prod_barcode']").val();
            var infoq = table.row(row).$("input[name='prod_quantity']").val();
            var infop = table.row(row).$("input[name='prod_price']").val();
            var url = "start-data-submit/" + "id=" + data + "&prod_barcode=" + info + "&prod_quantity=" + infoq + "&prod_price=" + infop + " ";
            $(location).attr('href', url);

route:

Route::get('start-data-submit/{id}&{prod_barcode}&{prod_quantity}&{prod_price}','StartDataController@update')

controller:

 public function prodview(Request $request)
    {
        $timestamps = Carbon::today();
        $prod_barcode = $request->route('prod_barcode');
        $prod_quantity = $request->route('prod_quantity');
        $prod_price = $request->route('prod_price');
        $uid = $request->route('id');

        DB::table('products')
            ->where('id', $uid)
            ->update(
                [
                    'updated_at' => $timestamps,
                    'prod_barcode' => $prod_barcode,
                    'prod_quantity' => $prod_quantity,
                    'prod_price' => $prod_price
                ]
            );
    }

似乎一切都是可见的 - 变量具有必要的值,但没有发生更新,也没有给出错误。

var_dump($timestamps,$prod_barcode,$prod_quantity,$prod_price,$uid);

问题:


object(Carbon\Carbon)#344 (3) { ["date"]=> string(26) "2020-07-17 00:00:00.000000" ["timezone_type"]=> int(3) ["timezone"]=> string(3) "UTC" } string(14) "prod_barcode=2" string(15) "prod_quantity=4" string(13) "prod_price=78" string(7) "id=4680"

还有什么地方可以挖掘?

【问题讨论】:

  • 尝试将Carbon::now() 用于$timestamps

标签: mysql laravel laravel-5 datatable


【解决方案1】:

问题是您在请求中发布的值还包含列名。

你有他们:

$prod_barcode = "prod_barcode=2";
$prod_quantity = "prod_quantity=4";
$prod_price = "prod_price=78";
$uid = "id=4680";

但希望它们为:

$prod_barcode = 2;
$prod_quantity = 4;
$prod_price = 78;
$uid = 4680;

您的主要问题是您正在使用路由参数,就像它们是 GET 参数一样。它们不是同一件事。路由参数是 url 的一部分,即)users/{user_id}/posts 其中user_id 是路由参数。 GET 参数是查询字符串,如users/posts?user_id=1

您访问路由参数 $request-&gt;route('user_id') 并访问查询字符串参数,例如 $request-&gt;query('user_id')

您可以像这样使用查询字符串正确访问您的数据:

$prod_barcode = $request->query('prod_barcode');
$prod_quantity = $request->query('prod_quantity');
$prod_price = $request->query('prod_price');
$uid = $request->query('id');

但是你js中的url是错误的,需要是:

var url = "start-data-submit?"...(Rest the same)

或者你可以这样做(这很糟糕):

$prod_barcode = explode('=', $request->route('prod_barcode'))[0];
$prod_quantity = explode($request->route('prod_quantity'))[0];
$prod_price = explode($request->route('prod_price'))[0];
$uid = explode($request->route('id'))[0];

对于基于路由参数的解决方案,在你的 JS 中你会这样做:

var data = table.row(row).data().id;
var info = table.row(row).$("input[name='prod_barcode']").val();
var infoq = table.row(row).$("input[name='prod_quantity']").val();
var infop = table.row(row).$("input[name='prod_price']").val();
var url = "start-data-submit/" + data + "/" + info + "/" + infoq + "/" + infop;
$(location).attr('href', url);

在你的路线文件中:

Route::get('start-data-submit/{id}/{prod_barcode}/{prod_quantity}/{prod_price}','StartDataController@update')

这允许您在控制器中执行以下操作:

public function prodview(int $prod_barcode, int $prod_quantity, int $prod_price, int $uid)
{
    $timestamp = Carbon::today();

    DB::table('products')
      ->where('id', $uid)
      ->update([
          'updated_at' => $timestamp,
          'prod_barcode' => $prod_barcode,
          'prod_quantity' => $prod_quantity,
          'prod_price' => $prod_price
      ]);
}

要解决您的事件绑定问题,您可以使用:

在重绘表格之前取消绑定现有的事件处理程序:

$('#start-data').on( 'page.dt', function () {
    $('.table-btn-class').each(function (idx, el) {
       el.prop("onclick", null).off("click");
    });
});

然后在重新绘制新页面后,像这样绑定所有处理程序:

$('#start-data').on('draw.dt', function () {
    $('.table-btn-class').each(function (idx, el) {
        el.on("click", function (el) {
            var row = el.closest('tr');
            var data = table.row(row).data().id;
            var info = table.row(row).$("input[name='prod_barcode']").val();
            var infoq = table.row(row).$("input[name='prod_quantity']").val();
            var infop = table.row(row).$("input[name='prod_price']").val();
            var url = "start-data-submit/" + "id=" + data + "&prod_barcode=" + info + "&prod_quantity=" + infoq + "&prod_price=" + infop + " ";
            $(location).attr('href', url);
       });
    }); 
});

【讨论】:

  • 现在我完全不明白在什么阶段将正确的值分配给变量以查询表
  • @Ing.VakulinOleg 请查看我的更新答案,了解更多详情。
  • 我非常感谢你 - 它有效。但是现在我面临另一个问题 - JS 只在填写输入时发送,只有最上面一行。
  • 在这种情况下,在任何页面上只有顶行。超过一万条记录
  • 您的问题是您使用的是$('#start-data tbody').on('click', 'button', function () { var row = $(this).closest('tr')
【解决方案2】:

控制器:

public function prodview(Request $request)
    {
        $timestamps = Carbon::today();
        $prod_barcode = $request->route('prod_barcode');
        $prod_quantity = $request->route('prod_quantity');
        $prod_price = $request->route('prod_price');
        $uid = $request->route('id');

        DB::table('products')
            ->where('id', $uid)
            ->update(
                [
                    'updated_at' => $timestamps,
                    'prod_barcode' => $prod_barcode,
                    'prod_quantity' => $prod_quantity,
                    'prod_price' => $prod_price
                ]
            );
    }

为了解决上述问题,您可以尝试以下方法:

方法一:

   //add products model on the top
    use App\Products;

  $products = Products::where('id', $uid);
  $products->fill($request->input())->save();

方法二:

     use Carbon\Carbon;
     use App\Products; 

        Products::where('id', $uid)
        ->update(
            [
                'updated_at' => Carbon::now(),
                'prod_barcode' => $request->prod_barcode,
                'prod_quantity' => $request->prod_quantity,
                'prod_price' => $request->prod_price
            ]
        );

您也可以使用$request-&gt;get('prod_barcode'),而不是$request-&gt;prod_barcode

希望这适用于您的情况!

【讨论】:

    猜你喜欢
    • 2021-01-19
    • 2017-04-30
    • 1970-01-01
    • 1970-01-01
    • 2017-10-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多