【问题标题】:Laravel DB::table update filedLaravel DB::table 更新字段
【发布时间】:2019-03-22 20:49:51
【问题描述】:

我有这个问题

DB::table('pro_orders_has_passengers')
    ->where('title_name','MR.')
    ->update([
        'title_name' => 'mr',
    ]);
DB::table('pro_orders_has_passengers')
    ->where('title_name','MRS.')
    ->update([
        'title_name' => 'mrs',
    ]);
DB::table('pro_orders_has_passengers')
    ->where('title_name','Miss')
    ->update([
        'title_name' => 'ms',
    ]);
DB::table('pro_orders_has_passengers')
    ->where('title_name','Girl')
    ->update([
        'title_name' => 'girl',
    ]);
DB::table('pro_orders_has_passengers')
    ->where('title_name','Boy')
    ->update([
        'title_name' => 'boy',
    ]);

我得到了正确的结果。但我希望在一个查询中得到这个结果。

类似这样的:

$titlename = ['MR.','MRS.','Miss','Girl','Boy'];

DB::table('pro_orders_has_passengers')
    ->where('title_name',$titlename)
    ->update([
        ........
    ]);

我该怎么做?

【问题讨论】:

  • 你可以试试REPLACE'title_name' => \DB::raw("REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(title_name, 'MR.', 'mr'), 'MRS.', 'mrs'), 'Miss', 'ms'),'Girl', 'girl'), 'Boy','boy')")

标签: php laravel lumen


【解决方案1】:

你可以更新它:

DB::table('table_1')
                ->join("table_2", "table_1.foreign_id", "=", "table_2.id")
                ->where("table_1.fied_test", "=", "a_condition")
                ->where("table_2.user_id", "=", auth()->id())
                ->update(["table_2.status_test" => "EN_COURS"]);

【讨论】:

    【解决方案2】:

    我认为这样你就可以实现你正在寻找的东西

    $titlename = ['MR.','MRS.','Miss','Girl','Boy'];
    for($i=0; $i < count($titlename);$i++) {
    DB::table('pro_orders_has_passengers')
                ->where('title_name',$titlename[$i])
                ->update(['title_name' => strtolower(str_replace('.', '' , $titlename[$i]))]);
    }
    

    或使用 foreach 循环,以提高代码可读性:

    $titlenames = ['MR.','MRS.','Miss','Girl','Boy'];
    foreach($titlenames as $titlename) {
    DB::table('pro_orders_has_passengers')
                ->where('title_name',$titlename)
                ->update(['title_name' => strtolower(str_replace('.', '' , $titlename))]);
    }
    

    【讨论】:

    • 对不起,我得到了未定义的偏移量:5
    • 对不起,如果使用 strtolower 无法删除先生后的点。太太。 ,但是谢谢先生
    • 检查更新的答案,它将从字符串中删除点
    【解决方案3】:
        $titlename = ['mr' => 'MR.','mrs' => 'MRS.','ms' => 'Miss','girl' => 'Girl', 'boy' => 'Boy'];
    
        $update_query = "UPDATE pro_orders_has_passengers SET title_name = CASE";
        foreach ($titlename  as $new_title => $title) {
           $update_query = $update_query . " WHEN title_name = '$title'  THEN  '$new_title'";
        }
        $update_query = $update_query . " END WHERE title_name IN ('".implode(array_values($titlename), '\',\'')."')";
        \DB::statement($update_query);
    

    试试这个方法。它将帮助您进行批量更新。

    最终输出将是

    更新 pro_orders_has_passengers SET title_name = CASE WHEN title_name =“先生。” THEN 'mr' WHEN title_name = 'MRS.' THEN 'mrs' WHEN title_name = 'Miss' THEN 'ms' WHEN title_name = 'Girl' THEN 'girl' WHEN title_name = 'Boy' THEN 'boy' WHERE END title_name IN ('先生','夫人','小姐','女孩','男孩')

    【讨论】:

    • 刚刚更新,如果有任何问题,请重试并粘贴确切的错误消息。
    • SQLSTATE[42000]:语法错误或访问冲突:1064 您的 SQL 语法有错误;检查与您的 MariaDB 服务器版本相对应的手册,以在第 1 行的 'WHERE title_name IN ('MR.','MRS.' ,'Miss','Girl','Boy') END' 附近使用正确的语法(SQL: UPDATE pro_orders_has_passengers SET title_name = CASE WHEN title_name = 'MR.' THEN 'mr' WHEN title_name = 'MRS.' THEN 'mrs' WHEN title_name = 'Miss' THEN 'ms' WHEN title_name = 'Girl' THEN 'girl ' WHEN title_name = 'Boy' THEN 'boy' WHERE title_name IN ('MR.','MRS.','Miss','Girl','Boy') END)
    【解决方案4】:

    试试这个。更多请参考以下链接

    1.I want to use CASE statement to update some records in sql server 2005

    2.运行一般性声明:https://laravel.com/docs/5.7/database

    DB::statement(
          UPDATE pro_orders_has_passengers
          SET title_name = CASE  
                        WHEN title_name = 'Mr.' THEN 'mr' 
                        WHEN title_name = 'Mrs.' THEN 'mrs' 
                        //-------Others cases-----//
                        ELSE LASTNAME
                    END 
          WHERE title_name IN ('Mr.', 'Mrs.', .....)
    );
    

    【讨论】:

      猜你喜欢
      • 2016-05-13
      • 2015-04-13
      • 2016-12-31
      • 2018-12-11
      • 1970-01-01
      • 2019-09-15
      • 1970-01-01
      • 2017-09-28
      • 1970-01-01
      相关资源
      最近更新 更多