Jump to content
php.lv forumi

One_to_many tabulas updeitošana.


Infants

Recommended Posts

Sveiki.

Ir vajadzīga neliela palīdzība ar loģikas izprašanu.

 

Piemērs būs stipri saīsināts, bet tā, lai galveno domu var saprast.

Ir tabulas - Invoices, Invoice_Items, Items, Item_Stock.

Invoices: id, number, summa...

Invoice_Items: id, invoice_id, item_id, daudzums, cena...

Items: id, name, .....

Item_Stock: id, item_id, daudzums.....

Doma, ceru, visiem ir skaidra, kas ar ko un kā ir sasaistīts.

Ir smuka forma, kurā tas viss tiek ievadīts un saglabāts.

Iekš 'Invoice_Items', saglabājot vienu vai vairākus ierakstus, katrs ieraksts atjauno vēl kādu ierakstu citā tabulā, piemēram, atjauno info tabulā 'Item_Stock".

Veidojot jaunu pavadzīmi, viss notiek baigi smuki, viss ir skaidrs.

Problēmu sagādā pavadzīmes labošana. (Īstenībā jau pa nesmuko nesagādā, bet pa nesmuko ir ļoti daudz queriji un iekšā 'vārās', ka to visu var izdarīt daudz smukāk.)

 

Šobrīd ir tā, ka labojot dokumentu, nolasa visus tās vecos itemus, noņem Item_Stock, izdzēš visus, un tad ievieto jaunos un pievieno stock.

 

Ir doma pārtaisīt, lai vecos Invoice_Items atrod pēc rindas id, un vienkārši updeito, bet.. kas notiek, ja labotajā dokumentā kāda rinda ir izdzēsta? Kā lai smuki nočeko, kuri invoice_items.id vairs neeksistē?

 

Tas tā, man labās idejas rodas, kad es vienkārši kādam pajautāju. Pat nevajag atbildi! Bet būšu ļoti priecīgs, ja pasviedīsi kādu ideju...

Link to comment
Share on other sites

Kāpēc tu miksē kolonnu nosaukumus angļu un latviešu valodā? Nemaz nerunājot par CamelCase + under_score stilu miksēšanu tabulu nosaukumos...

Kā lai smuki nočeko, kuri invoice_items.id vairs neeksistē?

Foreign keys much? Edited by jurchiks
Link to comment
Share on other sites

Kāpēc tu miksē kolonnu nosaukumus angļu un latviešu valodā? Nemaz nerunājot par CamelCase + under_score stilu miksēšanu tabulu nosaukumos...

Tas tā ir tikai jautājuma 'saīsinātajā variantā'. Reālajā db viss ir pēc kohana ORM stila un smuki. (Invoice_Items ir ORM modelis nevis datubāzes tabulas nosaukums. Sorry, laikam nevajadzēja tā rakstīt.)

 

Foreign keys much?

 

 

Izstāstīsi lūdzu sīkāk?

Edited by Infants
Link to comment
Share on other sites

Sakarā ar to, ka gan Tu neesi iedziļinājies jautājumā, gan arī es esmu to tizli pajautājis, te mans šībrīža jaunais post datu apstrādes kontrolieris. Esmu ticis līdz tai vietai, kur ir divrindu komentārs. (107-108 rindiņa)

Domāju, ko darīt tālāk. 

    public function action_process()
    {
        if (!$this->request->post()) die("Nav post dati!");
        
        $data = $this->request->post();
        $invoice = ORM::factory('Invoice', $data['id']);
        
        if ($invoice->loaded())
        { // Laboju veco pavadzīmi
            // $old_items glabā visus vecās pavadzīmes itemus
            $old_items = ORM::factory('Invoice_Item')
                ->where('invoice_id', '=', $invoice->id)
                ->find_all();
        } else { // Jauns dokuments! Jāčeko un jāuzliek autonumbers!
            if ($data['type'] == 'sale' &&
                $data['number'] == ORM::factory('Autonumber')->get_sale_number())
            {
                try {
                    ORM::factory('Autonumber')->set_sale_number();
                } catch (Exception $e) { // Kļūda var būt, ja pārsniedz MAX
                    $this->template->content = Debug::dump($e->errors());
                }
            }
            if ($data['type'] == 'cash' &&
                $data['number'] == ORM::factory('Autonumber')->get_cash_number())
            {
                try {
                    ORM::factory('Autonumber')->set_cash_number();
                } catch (Exception $e) { // Kļūda var būt, ja pārsniedz MAX
                    $this->template->content = Debug::dump($e->errors());
                }
            }
        }
        
        $invoice->values($data, array(
                                      'user_id',         'delivery_address',
                                      'comments',        'number',
                                      'payment_type_id', 'payment_date', 
                                      'transport'));
        $invoice->invoice_date = $data['date'];
        $invoice->year             = date("Y", strtotime($data['date']));
        $invoice->month            = date("m", strtotime($data['date']));
        $invoice->date             = date("d", strtotime($data['date']));
        $invoice->type_id          = ORM::factory(
                                        'Document_Type',
                                        array('address'=>$data['type']))->id;
        $invoice->subtotal         = Catalog::price_to_db($data['subtotal']);
        $invoice->tax              = Catalog::price_to_db($data['tax']);
        $invoice->total            = Catalog::price_to_db($data['total']);
        $invoice->salesperson_id   = Auth::instance()->get_user()->id;

        try {
            $invoice->check(); // Te jāliek pēc tam SAVE
        } catch(ORM_Validation_Exception $e) {
            $this->template->content = Debug::dump($e->errors());
        }
        
        // Kā tagad labāk darīt? Noņemt no stoka vecos itemus un izdzēst, vai
        //  mēģināt labot tos un meklēt, kuri bija un vairs nav?
        
        // Darbs ar invoice_items rindām
        foreach($data['item'] as $item)
        {
            try {
                ORM::factory('Invoice_Item')->add_invoice_item($item, $invoice->id);
            } catch (ORM_Validation_Exception $e) {
                $this->template->content = Debug::dump($e->errors());
            }
        }
        
    }
Edited by Infants
Link to comment
Share on other sites

Nav smuki dzēst datus, kurus tūlīt pat atkal insertosi db.

Izdzēs nederīgos, apdeito db jau esošos derīgos, inserto jaunos.

Lūk, šis bija tas, ko gribēju dzirdēt! Laikam ar kaut kādām array funkcijām to var smuki izdarīt, bet pietrūkst zināšanu... 

Link to comment
Share on other sites

Nu ja! Man ir divi array'i - $old_items kā vecie pavadzīmes itemi un $data['item'] kā jaunie no post datiem.

Kuram no tiem man taisīt foreach() ? Abiem?

Ok, ja foreach($old_items), tad salīdzinu ar $data['item']. Ja tur ir tāds id, tad update, ja nav - delete.

Pēc tam - Kā man dabūt no $data['item'] rindiņas kuras nav aiztiktas? (Jaunie itemi)?

 

Sajutos tik tizls, ka bail. :) 

Link to comment
Share on other sites

Nezinu gudri vai nē, bet pagaidām šāds variants izskatās ok. Vismaz nav jādzēš un jāinserto pa jaunu. Bail jau gan ir no tām funkcijām. 

        foreach(array_diff_key($old, $new) as $to_delete)
        {
            ORM::factory('Invoice_Item')->delete_invoice_item($to_delete, $invoice->id);
        }
        foreach(array_intersect_key($new, $old) as $to_update)
        {
            ORM::factory('Invoice_Item')->update_invoice_item($to_update, $invoice->id);
        }
        foreach(array_diff_key($new, $old) as $to_insert)
        {
            ORM::factory('Invoice_Item')->insert_invoice_item($to_insert, $invoice->id);
        }
Edited by Infants
Link to comment
Share on other sites

Jājautā grāmatvedībai, vai dzēst ir pareizi. Varbūt, ka jāatzīmē, kā vecas, nevis jādzēš, bet citādi visam vajadzētu būt ok.

Točna zini, ka array_diff_key un array_intersect_key atgriež tieši to, ko tu domā?

Šinī gadijumā es pats esmu grāmatvedība. Zinu, ko es drīkstu un ko nē. Galvenais ir, lai nekur nerodās gļuki.

Ar tiem diff un intersect pārbaudīju 10 dažādus gadījumus - atgrieza tieši to, ko vajag. Cerams, ka nepalika kāds nepārbaudīts variants.

Anyway, paldies Tev par palīdzību!

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
×
×
  • Create New...