Lykos22 Δημοσ. 10 Σεπτεμβρίου 2013 Δημοσ. 10 Σεπτεμβρίου 2013 Θα ήθελα μία βοήθεια σχετικά με ένα site που φτιάχνω σε CodeIgniter. Έχω δημιουργήσει τους εξής πίνακες: -- -- Table structure for table `products` -- CREATE TABLE IF NOT EXISTS `products` ( `product_id` int(10) unsigned NOT NULL AUTO_INCREMENT, `product_name` varchar(100) NOT NULL, `category_id` int(10) unsigned NOT NULL, `description` text, PRIMARY KEY (`product_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ; -- -- Table structure for table `features` -- CREATE TABLE IF NOT EXISTS `features` ( `feature_id` int(10) unsigned NOT NULL AUTO_INCREMENT, `features_name` varchar(100) NOT NULL, `category_id` int(10) unsigned NOT NULL, PRIMARY KEY (`feature_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ; -- -------------------------------------------------------- -- -- Table structure for table product_features` -- CREATE TABLE IF NOT EXISTS `product_features` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, `product_id` int(10) unsigned NOT NULL, `feature_id` int(10) unsigned NOT NULL, `feature_value` varchar(50) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ; -- -------------------------------------------------------- Η σχέση μεταξύ products - features είναι n-to-n (many-to-many), επειδή ένα product μπορεί να έχει πολλά features και ένα συγκεκριμένο feature να ανήκει σε πολλά products, γι αυτό δημιούργησα και τον 3ο πίνακα, στον οποίον έχω και το πεδίο `feature_value` όπου παίρνει το value που θα έχει το κάθε product για το αντίστοιχο feature, πχ: το product Nikon Digital camera έχει τα features optical zoom, megapixel και τα αντίστοιχα feature_values 6x και 10MP. Επίσης έχω δημιουργήσει μία φόρμα στο view μου, στην οποία μέσα σε ένα foreach loop θα εμφανίζει το feature και δίπλα του ακριβώς σε ένα input field θα μπαίνει το αντίστοιχο feature_value, κάπως έτσι δηλ. <?php foreach($features as $feature): ?> <tr> <td><?php echo form_hidden('feature_id[]', $feature->feature_id); ?></td> <td><?php echo $feature->feature_name; ?></td> <td><?php echo form_input('feature_value[]',set_value('feature_value[]', $feature->feature_value)); ?></td> </tr> <?php endforeach; ?> Προσπαθώ να κατασκευάσω το query και στη συνάχεια να το περάσω σαν Active Record σε μία function το οποίο θα μου επιστρέφει τα features & feature_values για το αντίστοιχο product εαν έχει γίνει ήδη κάποια εισαγωγή στη βδ, αλλιώς εαν δεν έχει γίνει θα πρέπει να εμφανίζει όλα τα features και τα αντίστοιχα input fields (δηλ τα feature_values) να είναι κενά. Το query μου μέχρι στιγμής είναι αυτό SELECT `features`.*, `product_features`.`feature_value` FROM (`features`) LEFT JOIN `product_features` ON `features`.`feature_id`=`product_features`.`feature_id` WHERE `product_features`.`product_id` = 1 //* το οποίο από το phpmyadmin όπου το τεστάρω δεν επιστρέφει τίποτα. Ο λόγος που μπορώ να υποθέσω ότι γίνεται αυτό είναι επειδή ο πίνακας `product_features` μέχρι στίγμής είναι άδειος. Αντίθετα εαν αφαιρέσω τη γραμμή με το * στο query επιστρέφει όλα τα πεδία από τον features και null στο feature_value.
Lykos22 Δημοσ. 11 Σεπτεμβρίου 2013 Μέλος Δημοσ. 11 Σεπτεμβρίου 2013 Θέλω να το query μου να εμφανίζει τα αντίστοιχα features και feature_values που έχει ένα προϊόν. Αν κάποιο feature_value είναι κενό να επιστρέφει μία κενή τιμή πχ null p.s. το query θα το περάσω σε μια function σαν active record όπου θα της παιρνάω το product_id
bikey77 Δημοσ. 13 Σεπτεμβρίου 2013 Δημοσ. 13 Σεπτεμβρίου 2013 Δοκίμασε κάτι τέτοιο: if($rowcount = $query->num_rows()) { ... } Επίσης, στον product_features δε χρειάζεσαι το πεδίο feature_value, το έχεις στον πίνακα features (το πεδίο feature_name αν δεν κάνω λάθος). 1
Lykos22 Δημοσ. 13 Σεπτεμβρίου 2013 Μέλος Δημοσ. 13 Σεπτεμβρίου 2013 Επίσης, στον product_features δε χρειάζεσαι το πεδίο feature_value, το έχεις στον πίνακα features (το πεδίο feature_name αν δεν κάνω λάθος). To feature_value δεν είναι το ίδιο με το feature_name. Φαντάσου το κάπως έτσι: product_id |feature_id |feature_name | feature_value 1 | 1 | Processor | Intel Core I5 1 | 2 | RAM | 1Gb 1 | 3 | Hard Disk | 500Gb κλπ κλπ
dewn735 Δημοσ. 13 Σεπτεμβρίου 2013 Δημοσ. 13 Σεπτεμβρίου 2013 Μάλλον αυτό ζητάς: SELECT * FROM products LEFT JOIN product_features on product_features.product_id = products.id LEFT JOIN features on features.feature_id = product_features.feature_id WHERE products.id = product_id
Lykos22 Δημοσ. 13 Σεπτεμβρίου 2013 Μέλος Δημοσ. 13 Σεπτεμβρίου 2013 Όχι. με αυτό το query τραβάς λάθος δεδομένα από λάθος πίνακα
bikey77 Δημοσ. 13 Σεπτεμβρίου 2013 Δημοσ. 13 Σεπτεμβρίου 2013 To feature_value δεν είναι το ίδιο με το feature_name. Φαντάσου το κάπως έτσι: product_id |feature_id |feature_name | feature_value 1 | 1 | Processor | Intel Core I5 1 | 2 | RAM | 1Gb 1 | 3 | Hard Disk | 500Gb κλπ κλπ Καλά, θα τα πούμε στο Modo. 1
Lykos22 Δημοσ. 13 Σεπτεμβρίου 2013 Μέλος Δημοσ. 13 Σεπτεμβρίου 2013 Καλά, θα τα πούμε στο Modo. meeting απο κοντα!
dewn735 Δημοσ. 13 Σεπτεμβρίου 2013 Δημοσ. 13 Σεπτεμβρίου 2013 Όχι. με αυτό το query τραβάς λάθος δεδομένα από λάθος πίνακα Για αυτά τα τυχαία δεδομένα -- phpMyAdmin SQL Dump -- version 3.5.2.2 -- http://www.phpmyadmin.net -- -- Host: 127.0.0.1 -- Generation Time: Sep 13, 2013 at 05:33 PM -- Server version: 5.5.27 -- PHP Version: 5.4.7 SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO"; SET time_zone = "+00:00"; -- -- Database: `test` -- -- -------------------------------------------------------- -- -- Table structure for table `features` -- CREATE TABLE IF NOT EXISTS `features` ( `feature_id` int(10) unsigned NOT NULL AUTO_INCREMENT, `features_name` varchar(100) NOT NULL, `category_id` int(10) unsigned NOT NULL, PRIMARY KEY (`feature_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=3 ; -- -- Dumping data for table `features` -- INSERT INTO `features` (`feature_id`, `features_name`, `category_id`) VALUES (1, 'Processor', 2), (2, 'RAM', 3); -- -------------------------------------------------------- -- -- Table structure for table `products` -- CREATE TABLE IF NOT EXISTS `products` ( `product_id` int(10) unsigned NOT NULL AUTO_INCREMENT, `product_name` varchar(100) NOT NULL, `category_id` int(10) unsigned NOT NULL, `description` text, PRIMARY KEY (`product_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=2 ; -- -- Dumping data for table `products` -- INSERT INTO `products` (`product_id`, `product_name`, `category_id`, `description`) VALUES (1, 'test', 2, 'test'); -- -------------------------------------------------------- -- -- Table structure for table `product_features` -- CREATE TABLE IF NOT EXISTS `product_features` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, `product_id` int(10) unsigned NOT NULL, `feature_id` int(10) unsigned NOT NULL, `feature_value` varchar(50) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=4 ; -- -- Dumping data for table `product_features` -- INSERT INTO `product_features` (`id`, `product_id`, `feature_id`, `feature_value`) VALUES (1, 1, 1, 'Intel Core I5'), (2, 1, 2, '1Gb'), (3, 1, 2, '500G'); αυτό το query SELECT * FROM products LEFT JOIN product_features ON product_features.product_id = products.product_id LEFT JOIN features ON features.feature_id = product_features.feature_id WHERE products.product_id =1 LIMIT 0 , 30 για το προϊόν test μου φέρνει αυτά: product_id product_name category_id description id product_id feature_id feature_value feature_id features_name category_id 1 test 2 test 1 1 1 Intel Core I5 1 Processor 2 1 test 2 test 2 1 2 1Gb 2 RAM 3 1 test 2 test 3 1 2 500G 2 RAM 3 Τι ακριβώς θες να σου φέρνει;
Lykos22 Δημοσ. 14 Σεπτεμβρίου 2013 Μέλος Δημοσ. 14 Σεπτεμβρίου 2013 Συγνώμη, έχεις δίκιο, εγώ δεν ήμουν αρκετά σαφής. Το query επιστρέφει δεδομένα σωστά, αλλά μόνο έτσι όπως το έχεις κάνει εσύ, να βάζεις εγγραφές από το phpmyadmin. Θα εξηγήσω ακριβώς τι θέλω να κάνω. Έχω 3 διαφορετικές φόρμες, στην 1η κάνω εισαγωγή νέου feature ή edit κάποιου που υπάρχει ήδη (δίνω feature_name και σε ποια κατηγορία θα ανήκει). Στην 2η (url: products/product), ομοίως με την 1η, κάνω εισαγωγή νέου προϊόντος ή εαν υπάρχει product_id στο url (products/product/1) κάνω επεξεργασία ενός που υπάρχει ήδη (πχ του 1 στην συγκεκριμενη περίπτωση). Στην 3η θέλω να κάνω πάλι το ίδιο, δηλαδή ή να αναθέτω feature_values για ένα νέο προϊόν ή να κάνω επεξεργασία για ένα ήδη υπάρχων προϊόν. Η διαφορά εδώ είναι ότι θέλω να εμφανίζω τα features που ανήκουν στην ίδια κατηγορία που ανήκει και το προϊόν και δίπλα το πεδίο της φόρμας όπου θα έιναι το feature_value. Εαν προσέξεις το πρώτο μου post στο topic το δείχνω ακριβώς τι θέλω να κάνω. Το πρόβλημα στο σενάριο της εισαγωγής είναι ότι επειδή ο πίνακας product_features είναι κενός δεν επιστρέφει results και είναι λογικό αφού δεν έχει ακόμα το product id 1 κάποια feature_values (εκτός και αν τα βάλω μέσω του phpmyadmin). Επομένως σε αυτή την περίπτωση θέλω να εμφανίζει τα features και τα πεδία της φόρμας (feature_values) κενά για να κάνω εισαγωγή. Στο σενάριο του update θα πρέπει να εμφανίζει και τα feature_values κανονικά. Ήμουν κατανοητός ή "χάθηκε η μπάλα" ???
Προτεινόμενες αναρτήσεις
Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε
Πρέπει να είστε μέλος για να αφήσετε σχόλιο
Δημιουργία λογαριασμού
Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!
Δημιουργία νέου λογαριασμούΣύνδεση
Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.
Συνδεθείτε τώρα