Δύο πίνακες σε ένα Index - Cakephp [και συμβουλές για διάβασμα]

Σε αυτή την περιοχή μπορείτε να βρείτε ή να αναζητήσετε πληροφορίες σχετικές με την PHP

Συντονιστές: WebDev Moderators, Super-Moderators, PHP Moderators

Απάντηση
logintech
Δημοσιεύσεις: 10
Εγγραφή: 05 Νοέμ 2012 14:29

Δύο πίνακες σε ένα Index - Cakephp [και συμβουλές για διάβασμα]

Δημοσίευση από logintech » 30 Ιαν 2015 11:07

Γεια χαρά σε όλους

Μου έχει ζητηθεί από μία εταιρία να μάθω Cakephp έτσι ώστε να έχω την δυνατότητα για συνέντευξη. Έχω 2μιση μέρες που πραγματικά σπάω το κεφάλι μου να καταλάβω πώς δουλεύει αυτό το πρόγραμμα. Ξέρω καθαρή php. Έχω διαβάσει το manual του Cakephp 2 φορές και ακόμη προσπαθώ να καταλάβω το γιατί και το πώς (πχ το "magic" με τα ονόματα αρχείων κτλ). Αυτά που έχω να κάνω, με καθαρή php, μπορώ να τα φτιάξω σε μισό απόγευμα, τα ίδια όμως στο cakephp ακόμη κοιτάω την οθόνη και δεν ξέρω καν πως να ξεκινήσω. Θέλω κάποιον να μου ξεκαθαρίσει κάποια πράγματα και να με κατευθύνει λίγο στο τι και που πιθανόν έχω έλλειψη γνώσεων.
Έχω διάφορα να κάνω αλλά προσπαθώ να κάνω το πιο απλό (δεν είναι κάτι που μου ζητάνε και ούτε ψάχνω να μου λύσει κάποιος τα tasks, γιατί όπως ξέρετε αν με πάρουν, δεν θα έχω δίπλα μου κανένα freestuff). Στην πράξη: θέλω απλά να εμφανίσω 2 πίνακες στο ίδιο index. MONO αυτό. Σε καθαρή php κάνεις δύο query, δύο while, τέλος. Τί γίνετε στο cakephp;;;;

Tables:

Κώδικας: Επιλογή όλων

CREATE TABLE posts (
    id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    title VARCHAR(50),
    body TEXT,
    created DATETIME DEFAULT NULL,
    modified DATETIME DEFAULT NULL
);

CREATE TABLE comments (
    post_id INT UNSIGNED AUTO_INCREMENT,
    name VARCHAR(50),
    comment TEXT,
    created DATETIME DEFAULT NULL,
	FOREIGN KEY (post_id) REFERENCES posts(id)
);
PostsController.php

Κώδικας: Επιλογή όλων

<?php
class PostsController extends AppController &#123;
    public $helpers = array&#40;'Html', 'Form'&#41;;

    public function index&#40;&#41; &#123;
        $this->set&#40;'posts', $this->Post->find&#40;'all'&#41;&#41;;
    &#125;
&#125;
?>
Posts.php (model)

Κώδικας: Επιλογή όλων

<?php
class Posts extends AppModel &#123;
&#125;
?>
...View>Posts>index.ctp (Δεν μας ενδιαφέρει αλλά σας το εμφανίζω μήπως και...)

Κώδικας: Επιλογή όλων

<h1>Blog posts</h1>
<table>
    <tr>
        <th>Id</th>
        <th>Title</th>
        <th>Created</th>
    </tr>

    <!-- Here is where we loop through our $posts array, printing out post info -->

    <?php foreach &#40;$posts as $post&#41;&#58; ?>
    <tr>
        <td><?php echo $post&#91;'Post'&#93;&#91;'id'&#93;; ?></td>
        <td>
            <?php echo $this->Html->link&#40;$post&#91;'Post'&#93;&#91;'title'&#93;,array&#40;'controller' => 'posts', 'action' => 'view', $post&#91;'Post'&#93;&#91;'id'&#93;&#41;&#41;; ?>
        </td>
        <td><?php echo $post&#91;'Post'&#93;&#91;'created'&#93;;
		?></td>
    </tr>
    <?php endforeach; ?>
    <?php unset&#40;$post&#41;; ?>
</table>

Έως εδώ δουλεύει μια χαρά. Παίρνει τον πίνακα "Posts" και τον εμφανίζει. Θέλω στο ίδιο index να εμφανίσω τον πίνακα "Comments". Έχω δοκιμάσει σχεδόν τα πάντα αλλά δεν δουλεύει τίποτα. Κάτι δεν ξέρω, κάτι μου λείπει από γνώσεις. (Ξέρω πως έχει "hasmany" σύνδεση με τον πίνακα Posts αλλά αγνοήστε το).

Έχω δοκιμάσει αυτό:
PostsController.php

Κώδικας: Επιλογή όλων

<?php
class PostsController extends AppController &#123;
    public $helpers = array&#40;'Html', 'Form'&#41;;

    public function index&#40;&#41; &#123;
        $this->set&#40;'posts', $this->Post->find&#40;'all'&#41;&#41;;
        $this->set&#40;'posts', $this->Comment->find&#40;'all'&#41;&#41;;
    &#125;
&#125;
?>
Έφτιαξα και ένα model για το Comment όπως ακριβώς για το Posts αλλά το find() μου λέει πως χτυπάει σε non-object και απ' ότι κατάλαβα δεν βρίσκει το model.

Επίσης αυτή η γραμμούλα "$this->set('posts', $this->Post->find('all'));" εάν την λέξη "Post" την κάνω "Posts" επίσης χτυπάει! Όλα τα έχω στον πληθυντικό! Γιατί χτυπάει;
Μέσα στο manual (στο official site) λέει πως τα αρχεία μπορώ να τα ονομάζω και έτσι "Posts_Controller.php". Εάν το κάνω αυτό επίσης χτυπάει και δεν βρίσκει το αρχείο. Ότι και αν έχω δοκιμάσει θα έχω δύο errors. Είτε δεν θα βρίσκει το αρχείο είτε το find θα χτυπάει σε non-object.

* Αν κάποιος βαριέται να γράψει (καταλαβαίνω είναι πολλά) είμαι διατεθειμένος να τον πάρω τηλέφωνο.
** Αν κάποιος κατάλαβε ΤΙ δεν ξέρω, που έχω κενό, ας μου το πει για να ξεκινήσω να το διαβάζω και αυτό.

Άβαταρ μέλους
webdevgr
Δημοσιεύσεις: 697
Εγγραφή: 11 Δεκ 2010 17:25
Τοποθεσία: Ηράκλειο
Επικοινωνία:

Δύο πίνακες σε ένα Index - Cakephp [και συμβουλές για διάβασμα]

Δημοσίευση από webdevgr » 30 Ιαν 2015 11:52

Δεν έχω δουλέψει cakephp, δουλεύω Laravel που μέσα από τα models μπορείς να ορίσεις τα hasmany κλπ

Απ' ότι βλέπω έχει κάτι παρόμοιο και το cakephp.

Για ρίξε μια ματιά εδώ:

http://book.cakephp.org/2.0/en/models/a ... ether.html

logintech
Δημοσιεύσεις: 10
Εγγραφή: 05 Νοέμ 2012 14:29

Δύο πίνακες σε ένα Index - Cakephp [και συμβουλές για διάβασμα]

Δημοσίευση από logintech » 30 Ιαν 2015 12:01

webdevgr έγραψε:Δεν έχω δουλέψει cakephp, δουλεύω Laravel που μέσα από τα models μπορείς να ορίσεις τα hasmany κλπ

Απ' ότι βλέπω έχει κάτι παρόμοιο και το cakephp.

Για ρίξε μια ματιά εδώ:

http://book.cakephp.org/2.0/en/models/a ... ether.html
Ευχαριστώ για την απάντησή σου. Σε αυτά τα προγράμματα δεν υπάρχει άλλος τρόπος να εμφανίσω δύο πίνακες; Θα πρέπει οπωσδήποτε να θέσω μία σύνδεση μεταξύ τους; Αν οι πίνακες είναι ασύνδετοι;

Άβαταρ μέλους
webdevgr
Δημοσιεύσεις: 697
Εγγραφή: 11 Δεκ 2010 17:25
Τοποθεσία: Ηράκλειο
Επικοινωνία:

Δύο πίνακες σε ένα Index - Cakephp [και συμβουλές για διάβασμα]

Δημοσίευση από webdevgr » 30 Ιαν 2015 12:12

Λογικά πρέπει να είναι κάπως έτσι

Κώδικας: Επιλογή όλων


$posts =$this->Post->find&#40;'all'&#41;;
$comments =$this->Comment->find&#40;'all'&#41;;


logintech
Δημοσιεύσεις: 10
Εγγραφή: 05 Νοέμ 2012 14:29

Δύο πίνακες σε ένα Index - Cakephp [και συμβουλές για διάβασμα]

Δημοσίευση από logintech » 30 Ιαν 2015 13:22

Κάτι χάνω με τις συνδέσεις των αρχείων και τα ονόματα μάλλον. Απ' ότι γράφουν για το OOP μόλις επισκέπτομαι μια σελίδα πχ Posts (localhost/cake/Posts) ψάχνει για τον controller PostsController. Αυτός με την σειρά του ψάχνει για το model PostsModel και τελικά εμφανίζονται τα αποτελέσματα στο index.

Τώρα που έχω δύο πίνακες Posts και Comments αν βάλω δύο μεταβλητές δεν μπορεί να βρει το model.
πχ

Κώδικας: Επιλογή όλων

<?php
class PostsController extends AppController &#123;
 
    public function index&#40;&#41; &#123;
		$posts = $this->Post->find&#40;'all'&#41;;
		$this -> set &#40;'posts',$posts&#41;;
		$comments = $this->comment->find&#40;'all'&#41;;
		$this -> set &#40;'comments',$comments&#41;;
    &#125;
&#125;
?>
Μου χτυπάει στο "$comments = $this->comment->find('all');" και μάλλον στην λέξη "comment". Έφτιαξα το CommentModel αλλά και πάλι τίποτα. Το error παραμένει το ίδιο:

Κώδικας: Επιλογή όλων

Error&#58; Call to a member function find&#40;&#41; on a non-object	
File&#58; C&#58;\xampp\htdocs\cake\app\Controller\PostsController.php	
Line&#58; 8

alou
Script Master
Δημοσιεύσεις: 1374
Εγγραφή: 24 Αύγ 2007 19:52
Επικοινωνία:

Δύο πίνακες σε ένα Index - Cakephp [και συμβουλές για διάβασμα]

Δημοσίευση από alou » 30 Ιαν 2015 17:55

Καταρχάς

Κώδικας: Επιλογή όλων

CREATE TABLE comments &#40;
    post_id INT UNSIGNED AUTO_INCREMENT,
    name VARCHAR&#40;50&#41;,
    comment TEXT,
    created DATETIME DEFAULT NULL,
   FOREIGN KEY &#40;post_id&#41; REFERENCES posts&#40;id&#41;
&#41;;
δεν μπορείς να έχει auto increment ένα πεδίο που είναι reference και πιθανότατα υπάρχει παραπάνω από μία φορές.

Χρειάζεσαι επιπλέον στήλη, id, που θα είναι auto increment και primary index.

Λες:

Κώδικας: Επιλογή όλων

public function index&#40;&#41; &#123;
      $posts = $this->Post->find&#40;'all'&#41;;
      $this -> set &#40;'posts',$posts&#41;;
      $comments = $this->comment->find&#40;'all'&#41;;
      
Τι είναι το $this->comment ; (βασικά το $this σε αυτό το context είναι το data object που φτιάχνεις για το view? δεν είμαι σίγουρος)

Έχεις φτιάξει κάποιο model? (και για τα comments) έχεις δηλώσει το συσχετισμό των comments με τα posts? αν ναι, αυτό θα μπορούσε να αποτελεί την $this->comment και να λειτουργήσει με τον τρόπο που τα έχεις.

Ρίξε μια ματιά εδώ για το ORM
http://book.cakephp.org/3.0/en/orm/associations.html

logintech
Δημοσιεύσεις: 10
Εγγραφή: 05 Νοέμ 2012 14:29

Δύο πίνακες σε ένα Index - Cakephp [και συμβουλές για διάβασμα]

Δημοσίευση από logintech » 30 Ιαν 2015 20:20

Γεια σου alou

Να σου πω την αλήθεια προσπαθώ να καταλάβω εδώ και μέρες τι είναι το καθένα γιατί κάνω αλλαγές και άλλοτε δουλεύουν και άλλοτε όχι. Να σου δώσω ένα απλό παράδειγμα, στο manual του προγράμματος λέει πως μπορώ να έχω ως όνομα αρχείου "Posts_Controller.php" αντί για "PostsController.php" χωρίς να κάνω καμία δήλωση πουθενά. Δεν δουλεύει... δεν βρίσκει το αρχείο.

Τώρα όσων αφορά αυτό που με ρωτάς:
Από όσα έχω καταλάβει το $this -> comment στην ουσία λέει να πάει να κοιτάξει το model με όνομα Comments.php που υπάρχει μέσα στον φάκελο Model. Το εν λόγο αρχείο είναι επίσης άδειο όπως και το Posts.php. Δλδ:

Κώδικας: Επιλογή όλων

<?php 
class Comments extends AppModel &#123; 
&#125; 
?>
Παρ' όλα αυτά έχω πετύχει να εμφανίσω τους δύο πίνακες χωρίς να κάνω συνδέσεις. Αυτό που έκανα ήταν να αλλάξω το αρχείο PostsController.php έτσι:

Κώδικας: Επιλογή όλων

<?php
class PostsController extends AppController &#123;
    public $uses = array&#40;'Post','Comment'&#41;;
    public function index&#40;&#41; &#123;
        //$this->set&#40;'posts', $this->Post->find&#40;'all'&#41;&#41;;
		$posts = $this->Post->find&#40;'all'&#41;;
		$this -> set &#40;'posts',$posts&#41;;
		$comments = $this->Comment->find&#40;'all'&#41;;
		$this -> set &#40;'comments',$comments&#41;;
    &#125;
&#125;
?>
Τα υπόλλοιπα είναι έτσι όπως τα έχω και στο πρώτο μου post. Δεν ξέρω τί κάνει αυτή η γραμμή:

Κώδικας: Επιλογή όλων

public $uses = array&#40;'Post','Comment'&#41;;
η οποία έλυσε όλο το πρόβλημα. Τώρα θα πρέπει να κάνω αυτό που λες. Να βρω δηλαδή έναν τρόπο να συνδέσω αυτούς τους δύο πίνακες (και στην βάση - όντως έχω λάθος στην βάση(εύκολο να το διορθώσω)) αλλά και στο πρόγραμμα. Δεν ξέρω αν θα πρέπει να γίνει στον Controller ή στο Model και σε πιο από τα δύο Model. Έχω διαβάσει διάφορα tutorials και ο κάθε ένας το γράφει όπως θέλει με τα δικά του ενδεχόμενα. Κάτι απλό με εξηγήσεις (γιατί και πως) σαν αυτό που προσπαθώ να κάνω, δεν έχω βρει.

Να προσθέσω και κάτι ακόμα: Ακόμη και να σβήσω τα δύο model, οι δύο πίνακες εμφανίζονται κανονικά. Μην με ρωτήσεις γιατί....

Απάντηση

Επιστροφή στο “PHP Προγραμματισμός”

Μέλη σε σύνδεση

Μέλη σε αυτήν τη Δ. Συζήτηση: Δεν υπάρχουν εγγεγραμμένα μέλη και 1 επισκέπτης