phalcon / cphalcon

High performance, full-stack PHP framework delivered as a C extension.
https://phalcon.io
BSD 3-Clause "New" or "Revised" License
10.79k stars 1.96k forks source link

[NFR]: How to perform batch modification operations without querying and iterate through modifications #16664

Open tingleiwuyan opened 1 week ago

tingleiwuyan commented 1 week ago

How to perform batch modification operations without querying and iterate through modifications

According to the document:

An UPDATE statement performs the update in two phases:

  1. Retrieval: If the UPDATE has a WHERE clause, it retrieves all the objects that match these criteria.
  2. Update: Based on the queried objects, it updates the requested attributes and stores them in the database.

This way of operation allows events, virtual foreign keys, and validations to be executed during the updating process. In short, the code:

<?php

$phql = "
    UPDATE Invoices
    SET
        inv_status_flag = 0,
        inv_total = 0
    WHERE
        inv_cst_id > 10";

$result = $this
    ->modelsManager
    ->executeQuery($phql)
;

if (false === $result->success()) {
    $messages = $result->getMessages();

    foreach ($messages as $message) {
        echo $message->getMessage();
    }
}

is somewhat equivalent to:

<?php

use MyApp\Models\Invoices;

$messages = [];
$invoices = Invoices::find(
    [
        'conditions' => 'inc_cst_id = :customerId:',
        'bind'       => [
            'customerId' => 10,
        ],
    ]  
);

foreach ($invoices as $invoice) {
    $invoice->inv_status_flag = 0;
    $invoice->inv_total       = 0;

    $result = $invoice->save();
    if (false === $result) {
        $messages[] = $invoice->getMessages();
    } 
}

For more details, you can refer to the Phalcon documentation.

raicabogdan commented 1 week ago

If you know the queries you're making and want to bypass those checks, then you can run a native query instead https://docs.phalcon.io/5.8/db-layer/#update