【问题标题】:How to get only updated row from database and make app more efficient如何从数据库中仅获取更新的行并使应用程序更高效
【发布时间】:2019-07-12 07:56:02
【问题描述】:

我正在创建 laravel/vue.js CRUD 应用程序,目前一切正常,但我担心更新数据后对数据库的查询质量。

每次更新数据库中的行时,我都在使用 getAllData()。现在,当我在数据库中有几条记录时,每次询问服务器并在 vue 中呈现新列表不是问题,但是当我有几千行时,它会使我的应用程序变得缓慢而沉重。

现在我像这样更新数据库:

这是 我的 vue.js 更新功能的一部分:

updateStatus: function(id){

    var index = _.findIndex(this.rows,["id",id]);

    if (this.rows[index].pay_status=="waiting"){
       axios.put("http://127.0.0.1:8000/api/payments/"+id
       ,{pay_status:"payed"}).then((response)=>{

       this.getAllData();         
}

这是我的 vue.js getAllData 函数:

getAllData: function(){
        axios.get("http://127.0.0.1:8000/api/payments").then((response)=>{         
        this.rows = response.data;
        });       
}

还有我的PaymentsController:

namespace App\Http\Controllers;

use App\Payments;
use App\Suppliers;
use Illuminate\Http\Request;
use Illuminate\Http\Response;
use Faker\Generator;

class PaymentsController extends Controller
{
  public function index()
  {         
    $payments = Payments::with('suppliers')->get();
    return response($payments, Response::HTTP_OK);
  }
}

我的更新功能:

public function update(Request $request, $id)
{
    $payments = new Payments();
    payments::where('id', $id)->update($request->all());
}

是否有任何方法可以更有效地进行更新,例如仅从数据库中获取更新的行并将其放入现有的行对象中?或者我不应该担心?

【问题讨论】:

  • 向我们展示来自控制器的api/payments/{id} 路由的逻辑

标签: sql database laravel vue.js


【解决方案1】:

没有看到你的逻辑:

您的控制器可以返回记录:

return response(['payment' => $payment], Response::HTTP_OK);

您的 axios 方法可以观察该响应,然后对索引进行替换(就像您之前获取索引时所做的那样)

.then((response) => {
    const { payment } = response.data;

    this.items[index] = payment;
})

只要itemsdata 中被实例化为[],那么它就是可观察的。

【讨论】:

  • 谢谢@Ohgodwhy。我忘记了 api/payments/{id} 的逻辑,但现在我更新了我的帖子。你能帮我,正确查询吗?
【解决方案2】:

如果您需要特定时间段的更新行。

另外,你可以做一件事。当用户更新行时,您可以将唯一 ID 存储在新表中,您可以通过该 ID 获取数据。然后当您不需要最新更新的数据时,您可以从新表中删除该 ID。

通过 ID 更新行时

  1. 在新表中插入 ID。
  2. 更新记录。
  3. 如果只需要更新记录>>使用后端条件 要求 >> 从新表中获取 id 与主表连接。
  4. 当您不需要最新更新的记录时。从中删除记录 新表。 >> 根据需求使用后端条件 >> 从主表中获取。

【讨论】:

  • 谢谢。你有这种解决方案的例子吗?
  • 抱歉,我无法为您提供代码。但是你可以随波逐流。来自 ans.(刚刚编辑。)
【解决方案3】:

正如@Ohgodwhy 所说,我像这样更改了我的代码,现在它可以正常工作了。

更新功能

public function update(Request $request, $id)
{
    $payments = new Payments();
    payments::where('id', $id)->update($request->all());
    return response(payments::where('id', $id)->get(), Response::HTTP_OK);
}

axios

    updateStatus: function(id){

           var index = _.findIndex(this.rows,["id",id]);

            if (this.rows[index].pay_status=="oczekuje"){
                axios.put("http://127.0.0.1:8000/api/payments/"+id,{pay_status:"zapłacono"}).then((response)=>{
                this.rows[index].pay_status=response.data[0].pay_status;
                this.waitingInvoices = this.countInvoices();
                this.toPay = this.calculatePayment();


            }); 
            } else if (this.rows[index].pay_status=="zapłacono"){
               axios.put("http://127.0.0.1:8000/api/payments/"+id,{pay_status:"oczekuje"}).then((response)=>{
               this.rows[index].pay_status=response.data[0].pay_status;
               this.waitingInvoices = this.countInvoices();
               this.toPay = this.calculatePayment();

            }); 
            }
    },

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多