Infants Posted January 21, 2014 Report Share Posted January 21, 2014 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... Quote Link to comment Share on other sites More sharing options...
jurchiks Posted January 21, 2014 Report Share Posted January 21, 2014 (edited) 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 January 21, 2014 by jurchiks Quote Link to comment Share on other sites More sharing options...
Infants Posted January 21, 2014 Author Report Share Posted January 21, 2014 (edited) 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 January 21, 2014 by Infants Quote Link to comment Share on other sites More sharing options...
jurchiks Posted January 21, 2014 Report Share Posted January 21, 2014 http://dev.mysql.com/doc/refman/5.6/en/create-table-foreign-keys.html Quote Link to comment Share on other sites More sharing options...
Infants Posted January 21, 2014 Author Report Share Posted January 21, 2014 (edited) 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 January 21, 2014 by Infants Quote Link to comment Share on other sites More sharing options...
jurchiks Posted January 21, 2014 Report Share Posted January 21, 2014 (edited) 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. Edited January 21, 2014 by jurchiks Quote Link to comment Share on other sites More sharing options...
Infants Posted January 21, 2014 Author Report Share Posted January 21, 2014 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... Quote Link to comment Share on other sites More sharing options...
jurchiks Posted January 21, 2014 Report Share Posted January 21, 2014 Wut? Kādām array funkcijām? Tev ir zināmi kritēriji, pēc kuriem atfiltrēt nederīgos? Tad izdzēs nederīgos pēc tiem kritērijiem. Pārējiem vienkārši UPDATE items SET x = y WHERE invoice_id = z Insertot taču mācēsi? Quote Link to comment Share on other sites More sharing options...
Infants Posted January 21, 2014 Author Report Share Posted January 21, 2014 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. :) Quote Link to comment Share on other sites More sharing options...
metal-0-1 Posted January 21, 2014 Report Share Posted January 21, 2014 Tās taču nav kaut kādas svarīgas pavadzīmes? Citādi varētu sanākt nopietnas problēmas. Quote Link to comment Share on other sites More sharing options...
Infants Posted January 21, 2014 Author Report Share Posted January 21, 2014 Tās ir svarīgas pavadzīmes. Kas tieši tevi satrauc? Iespēja labot pavadzīmi? :) Quote Link to comment Share on other sites More sharing options...
Infants Posted January 21, 2014 Author Report Share Posted January 21, 2014 (edited) 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 January 21, 2014 by Infants Quote Link to comment Share on other sites More sharing options...
jurchiks Posted January 21, 2014 Report Share Posted January 21, 2014 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ā? Quote Link to comment Share on other sites More sharing options...
Infants Posted January 21, 2014 Author Report Share Posted January 21, 2014 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! Quote Link to comment Share on other sites More sharing options...
jurchiks Posted January 22, 2014 Report Share Posted January 22, 2014 Ne jau ar variantiem vajag pārbaudīt, bet ar loģiku. Ja tev $old un $new array keys ir invoice item ID, tad ar tām funkcijām viss ir OK. Pārējā loģika jau no tevis atkarīga. Quote Link to comment Share on other sites More sharing options...
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.