Gestire Relazioni tra più tabelle

Salve,

mi trovo a dover affrontare questo problema.

STATO ATTUALE:

Ho 2 tabelle da gestire:

 1. Tab_Campionati [ campionato_id, campionato, isactive ]

 2. Tab_Eventi [ evento_id, campionato_id, evento, ispublic ]

Tramite un foreach($this->campionati as $campionato) : stampo tutti i campionati attivi

$this->fetchAll('isactive = 1','campionato_id ASC', null);

e tramite questa condizione:

if ($evento->campionato_id == $campionato->campionato_id):

sono in grado, di visualizzare gli eventi associati ad un determinato campionato.

PROBLEMA

Si presenta, quando, ho bisogno di visualizzare la lista dei campionati, solo se questi, hanno un evento associato, con una condizione del tipo (mi auguro di non sbagliare ???):

(SELECT * FROM Campionati as C, Eventi as E WHERE c.campionato_id = e.campionato_id)

e di conoscere il numero di eventi associati ad un campionato se visualizzato.

Sono stato abbastanza chiaro??

Grazie.

inviato 7 anni fa
C4rLoS
modificato 7 anni fa
X 0 X

PROBLEMA

Si presenta, quando, ho bisogno di visualizzare la lista dei campionati, solo se questi, hanno un evento associato, con una condizione del tipo (mi auguro di non sbagliare ???):

(SELECT * FROM Campionati as C, Eventi as E WHERE c.campionato_id = e.campionato_id)

e di conoscere il numero di eventi associati ad un campionato se visualizzato.

Sono stato abbastanza chiaro??

Grazie.

Per la prima domanda credo possa anche andare bene la tua query, altrimenti puoi usare un JOIN fra le due tabelle.

Se un campionato ha due o più eventi però ti verranno ritornati due o più record.

Per conoscere il numero di eventi associati ad un campionato fai una query di questo tipo:

SELECT COUNT(*) FROM Eventi WHERE campionato_id = ID_CHE_TI_INTERESSA

Non so se ho risposto al tuo problema...

risposto 7 anni fa
Mario Santagiuliana
X 0 X

Grazie,

ho avuto delle conferme che cercavo.

Ma, avrei bisogno anche di sapere, come gestire il tutto con zend, model e controller.

Grazie ;)

risposto 7 anni fa
C4rLoS
X 0 X

Puoi fare il tutto con Zend_Db_Table.

Puoi crearti un nuovo model creando una struttura simile per la cartella in cui contenere i modelli per il tuo database:

application/models/DbTable

Poi al suo interno crei i file contenti gli oggetti che sono estensioni di Zend_Db_Table per esempio Campionati.php:

<?php                                                                                                                   
class Model_DbTable_Campionati extends Zend_Db_Table
{
    protected $_name = 'Campionati'; # il nome della tua tabella
    
    # Inizi qui a definire le varie funzioni e metodi dell'oggetto.
}

Poi puoi nei tuoi controller creare l'oggetto con:

$campionati = new Model_DbTable_Campionati();

Qui in phpnews trovi degli articoli interessanti.

Sul web trovi anche altra documentazione.

Ti consiglio comunque di vedere quella ufficiale di Zend_Db_Table:

http://framework.zend.com/manual/en/zend.db.table.html

http://framework.zend.com/manual/en/zend.db.html

risposto 7 anni fa
Mario Santagiuliana
X 0 X

Bene,

ho fatto come da te consigliato.

Ma qualcosa mi sfugge.

Gli obiettivi sono:

1. visualizzare a video i Campionati (SERIEA-SERIEB-ecc) solo sè hanno un evento associato.

2. visualizzare a video gli eventi di quel campionato e il numero di righe presenti sul DB.

Non capisco come relazionare le tabelle.

Come faccio a mandare un parametro della tabella Campionati nella tabella Eventi, tipo la select:

(SELECT * FROM Campionati as C, Eventi as E WHERE c.campionato_id = e.campionato_id) ???

Questo è il mio indexController:

        
$campionato = new Campionati();
$this->view->campionati = $campionato->getCampionato();               
            
$evento = new Eventi();
$this->view->eventi = $evento->getEvento();

Suggerimenti ??

Grazie

risposto 7 anni fa
C4rLoS
X 0 X

Il modo più semplice e veloce che mi viene in mente è quello di creare un altro metodo in "Campionati()" per esempio, in modo che fai:

$this->view->campionati = $campionato->getCampionatiConEvento()

No?

risposto 7 anni fa
Mario Santagiuliana
X 0 X

Si, potrebbe andare.

ma nel model cosa scrivo??

posso nel model Campionati, richiamare campi del model Eventi ??

risposto 7 anni fa
C4rLoS
X 0 X

Si...cioè...non capisco dove sta il problema...crei una normalissima query...  ???

Puoi anche usare Zend_Db_Select:

http://framework.zend.com/manual/en/zend.db.select.html

risposto 7 anni fa
Mario Santagiuliana
modificato 7 anni fa
X 0 X

mmm io l'ho fatto, ma non funziona!!

questo è il mio model Campionati:

  class Campionati extends Zend_Db_Table_Abstract
  {
    protected $_name = 'campionati';
    protected $_primary = 'campionato_id';
    
    function getCampionato()
    {
      $sql = "SELECT * FROM Campionati as C, Eventi as E WHERE c.campionato_id = e.campionato_id";
      return $this->fetchAll($sql,'campionato_id ASC', null);
    }    
    
  }

ricevo questo messaggio di errore:

exception 'Zend_Db_Statement_Exception' with message 'SQLSTATE[21000]: Cardinality violation: 1241 Operand should contain 1 column(s)' in .....

ps.

grazie per il tempo che mi stai dedicando!!

risposto 7 anni fa
C4rLoS
X 0 X

Allora se ti va bene mantenere un modello come estensione di Zend_Db_Table(altrimenti puoi creare un oggetto con estenzione di Zend_Db che è la classe padre, o altrimenti anche usare zend_db_select come ti avevo detto) puoi anche fare così, cioè questo:

      $sql = "SELECT * FROM Campionati as C, Eventi as E WHERE c.campionato_id = e.campionato_id";
      return $this->fetchAll($sql,'campionato_id ASC', null);

Lo fai diventare così, facendo una query di join no?:

$select = $this->select()
                         ->from( array( 'c' => 'Campionati'))
                         ->join(array('e' => 'eventi'),
                                     'c.campionati_id = e.campionati_id',
                                      array() );

return $this->fetchAll($select);

Vedi un po' se soddisfa le tue richieste.

risposto 7 anni fa
Mario Santagiuliana
X 0 X

ho fatto come da te suggerito:

   
  class Campionati extends Zend_Db_Table_Abstract
  {
    protected $_name = 'campionati';
    protected $_primary = 'campionato_id';
       
    function getCampionato()
    {
      $select = $this->select()
                ->from(array( 'c' => 'Campionati'))
                ->join(array('e' => 'eventi'),'c.campionato_id = e.campionato_id',array() );

      return $this->fetchAll($select);
    }    
    
  }

ma ricevo questo messaggio di errore:

exception 'Zend_Db_Table_Select_Exception' with message 'Select query cannot join with another table' in
risposto 7 anni fa
C4rLoS
X 0 X

Puoi riportare l'intero errore...

risposto 7 anni fa
Mario Santagiuliana
X 0 X

Certo:

exception 'Zend_Db_Table_Select_Exception' with message 'Select query cannot join with another table' in C:\xampp\htdocs\lavoro\MyProject\library\Zend\Db\Table\Select.php:212
Stack trace:
#0 C:\xampp\htdocs\lavoro\MyProject\library\Zend\Db\Adapter\Abstract.php(456): Zend_Db_Table_Select->assemble()
#1 C:\xampp\htdocs\lavoro\MyProject\library\Zend\Db\Adapter\Pdo\Abstract.php(238): Zend_Db_Adapter_Abstract->query(Object(Zend_Db_Table_Select), Array)
#2 C:\xampp\htdocs\lavoro\MyProject\library\Zend\Db\Table\Abstract.php(1485): Zend_Db_Adapter_Pdo_Abstract->query(Object(Zend_Db_Table_Select))
#3 C:\xampp\htdocs\lavoro\MyProject\library\Zend\Db\Table\Abstract.php(1304): Zend_Db_Table_Abstract->_fetch(Object(Zend_Db_Table_Select))
#4 C:\xampp\htdocs\lavoro\MyProject\application\models\Campionati.php(17): Zend_Db_Table_Abstract->fetchAll(Object(Zend_Db_Table_Select))
#5 C:\xampp\htdocs\lavoro\MyProject\application\controllers\IndexController.php(33): Campionati->getCampionato()
#6 C:\xampp\htdocs\lavoro\MyProject\library\Zend\Controller\Action.php(513): IndexController->indexAction()
#7 C:\xampp\htdocs\lavoro\MyProject\library\Zend\Controller\Dispatcher\Standard.php(289): Zend_Controller_Action->dispatch('indexAction')
#8 C:\xampp\htdocs\lavoro\MyProject\library\Zend\Controller\Front.php(946): Zend_Controller_Dispatcher_Standard->dispatch(Object(Zend_Controller_Request_Http), Object(Zend_Controller_Response_Http))
#9 C:\xampp\htdocs\lavoro\MyProject\index.php(78): Zend_Controller_Front->dispatch()
#10 {main}
risposto 7 anni fa
C4rLoS
X 0 X

ho modificato il mio model Campionati:

<?php

  class Campionati extends Zend_Db_Select
  {
    protected $_name = 'campionati';
    protected $_primary = 'campionato_id';
    protected $_dependentTables = array('eventi');       

    function getCampionato()
    {
      
      // Opzioni di connessione
      campionato = new Campionati(array)
      $options = array ('host'     => 'localhost',  
                 'username' => 'root',
                 'password' => 'root',
                 'dbname'   => 'dbname');

      $db = Zend_Db::factory('PDO_MYSQL', $options);
      $select = $db->select()
                ->from(array( 'c' => 'Campionati'),array('campionato_id'))
                ->join(array('e' => 'eventi'),'c.campionato_id = e.campionato_id',array());

      return $this->fetchAll($select);
    }    
    
  }

e questo è il nuovo msg di errore che ricevo:

Catchable fatal error: Argument 1 passed to Zend_Db_Select::__construct() must be an instance of Zend_Db_Adapter_Abstract, none given, called in C:\xampp\htdocs\lavoro\MyProject\application\controllers\IndexController.php on line 32 and defined in C:\xampp\htdocs\lavoro\MyProject\Zend\Db\Select.php on line 163

Cosa devo fare ?

Grazie

risposto 7 anni fa
C4rLoS
modificato 7 anni fa
X 0 X

Modifica così:

<?php

  class Campionati extends Zend_Db_Table
  {
    protected $_name = 'campionati';
    protected $_primary = 'campionato_id';

    function getCampionato()
    {

      /*** Questa parte non dovresti definirla qui...inseriscila magari nella configurazione della tua applicazione
      Opzioni di connessione
      campionato = new Campionati(array)
      $options = array ('host'     => 'localhost',  
                 'username' => 'root',
                 'password' => 'root',
                 'dbname'   => 'dbname');

      $db = Zend_Db::factory('PDO_MYSQL', $options);
      ***/
      $select = $this->select()
                               ->from( array( 'c' => 'Campionati'))
                               ->join(array('e' => 'eventi'),
                                           'c.campionati_id = e.campionati_id',
                                            array() );

      return $this->fetchAll($select);
    }    
    
  }

Ti restituisce errori?

risposto 7 anni fa
Mario Santagiuliana
X 0 X

Essi, questo:

exception 'Zend_Db_Table_Select_Exception' with message 'Select query cannot join with another table' in C:\xampp\htdocs\lavoro\MyProject\library\Zend\Db\Table\Select.php:212
Stack trace:
#0 C:\xampp\htdocs\lavoro\MyProject\library\Zend\Db\Adapter\Abstract.php(456): Zend_Db_Table_Select->assemble()
#1 C:\xampp\htdocs\lavoro\MyProject\library\Zend\Db\Adapter\Pdo\Abstract.php(238): Zend_Db_Adapter_Abstract->query(Object(Zend_Db_Table_Select), Array)
#2 C:\xampp\htdocs\lavoro\MyProject\library\Zend\Db\Table\Abstract.php(1485): Zend_Db_Adapter_Pdo_Abstract->query(Object(Zend_Db_Table_Select))
#3 C:\xampp\htdocs\lavoro\MyProject\library\Zend\Db\Table\Abstract.php(1304): Zend_Db_Table_Abstract->_fetch(Object(Zend_Db_Table_Select))
#4 C:\xampp\htdocs\lavoro\MyProject\application\models\Campionati.php(16): Zend_Db_Table_Abstract->fetchAll(Object(Zend_Db_Table_Select))
#5 C:\xampp\htdocs\lavoro\MyProject\application\controllers\IndexController.php(33): Campionati->getCampionato()
#6 C:\xampp\htdocs\lavoro\MyProject\library\Zend\Controller\Action.php(513): IndexController->indexAction()
#7 C:\xampp\htdocs\lavoro\MyProject\library\Zend\Controller\Dispatcher\Standard.php(289): Zend_Controller_Action->dispatch('indexAction')
#8 C:\xampp\htdocs\lavoro\MyProject\library\Zend\Controller\Front.php(946): Zend_Controller_Dispatcher_Standard->dispatch(Object(Zend_Controller_Request_Http), Object(Zend_Controller_Response_Http))
#9 C:\xampp\htdocs\lavoro\MyProject\index.php(78): Zend_Controller_Front->dispatch()
#10 {main}
risposto 7 anni fa
C4rLoS
X 0 X

Per forza non funziona...Abbiamo indicato la tabella sbagliata:

      $select = $this->select()
                               ->from( array( 'c' => 'Campionati'))
                               ->join(array('e' => 'Eventi'), // <----era eventi e non Eventi
                                           'c.campionati_id = e.campionati_id',
                                            array() );

Riprova...

risposto 7 anni fa
Mario Santagiuliana
X 0 X

essì,

ho notato l'errore gia' ieri sera, ma non su Eventi, ma bensì su Campionati :)

Ora funziona.

Devo solo gestire meglio la query.

Perchè mi stampa a video due righe duplicate (Serie A) sé sulla tabella Eventi ci sono righe associate al campionato con id = 1., anzichè 1 sola riga per campionato, devo limitare la ricerca ?

Hai qualche suggerimento ?

Un ultima domana:

Ma a cosa servono le variabili $_referenceMap e $_dependentTables, e quando si devono usare??

Grazie  ;)

risposto 7 anni fa
C4rLoS
X 0 X

essì,

ho notato l'errore gia' ieri sera, ma non su Eventi, ma bensì su Campionati :)

Ah ecco  ;D

Perchè mi stampa a video due righe duplicate (Serie A) sé sulla tabella Eventi ci sono righe associate al campionato con id = 1., anzichè 1 sola riga per campionato, devo limitare la ricerca ?

Hai qualche suggerimento ?

In proposito ti avevo già risposto  8)

Se un campionato ha due o più eventi però ti verranno ritornati due o più record.

Come suggerimento...potresti fare un "distinct".

Un ultima domana:

Ma a cosa servono le variabili $_referenceMap e $_dependentTables, e quando si devono usare??

Dalla docuentazione ufficiale:

# referenceMap => an associative array, with information about references from this table to any parent tables. See Section 15.8.2, Defining Relationships.

# dependentTables => an array of class names of tables that reference this table. See Section 15.8.2, Defining Relationships.

http://framework.zend.com/manual/en/zend.db.table.html

 :bye:

risposto 7 anni fa
Mario Santagiuliana
X 0 X

Ottimo.

Grazie per la disponibilità.

risposto 7 anni fa
C4rLoS
X 0 X

Ehi, ci sei ancora ??

maron, c'e' qualcosa che non va'.

Non riesco a visualizzare correttamente i dati del db.

sicuramente sbaglio la relazione delle tabelle.

Dovrei riuscire ad ottenere questo risultato:

   <?php foreach($this->campionati as $campionato) : ?>
    <ul class='campionato' id='id<?php echo $this->escape($campionato->campionato_id);?>'>
        <li><strong><?php echo $this->escape($campionato->campionato);?></strong>     
            <?php foreach($this->eventi as $evento) : ?>
                <ul class='evento' id='id<?php echo $this->escape($evento->evento_id);?>'>
                    <li><i>&nbsp;&nbsp;&nbsp;<?php echo $this->escape($evento['evento']);?> : <?php echo $this->escape($evento['orario']);?></i></li>
                </ul>
            <?php endforeach; ?>
        </li>
    </ul>
    <?php endforeach; ?>

e questo è il risultato che ricevo:

   *  Serie A
          o    LAZIO - ROMA : 21:00:00
          o    MILAN - INTER : 18:00:00
          o    BARCELLONA - REAL MADRID : 22:00:00
          o    BRESCIA - TORINO : 18:00:00

    * Serie B
          o    LAZIO - ROMA : 21:00:00
          o    MILAN - INTER : 18:00:00
          o    BARCELLONA - REAL MADRID : 22:00:00
          o    BRESCIA - TORINO : 18:00:00

    * Liga
          o    LAZIO - ROMA : 21:00:00
          o    MILAN - INTER : 18:00:00
          o    BARCELLONA - REAL MADRID : 22:00:00
          o    BRESCIA - TORINO : 18:00:00

In realtà, dovrebbe essere cosi:

   *  Serie A
          o    LAZIO - ROMA : 21:00:00
          o    MILAN - INTER : 18:00:00

    * Serie B
          o    BRESCIA - TORINO : 18:00:00

    * Liga
          o    BARCELLONA - REAL MADRID : 22:00:00

Dove e cosa sbaglio ???

Grazie

risposto 7 anni fa
C4rLoS
modificato 7 anni fa
X 0 X
Ehi, ci sei ancora ??

Per dir la verità ero a letto a quell'ora...

Dove e cosa sbaglio ???

Semplicemente fai due cicli foreach annidati e il secondo foreach si preoccupa solamente di stampare tutti gli eventi presenti nell'array $this->eventi, non c'è una associazione fra i campionati e gli eventi ad essi associati.

Dovresti nel tuo controller creare all'interno dell'array $this->campionati un secondo array per ogni campionato estratto che faccia riferimento ai suoi eventi....non so se mi sono spiegato...

risposto 7 anni fa
Mario Santagiuliana
X 0 X

Mmm si e no,

mi fai qualke esempio, x favore ?

grazie

risposto 7 anni fa
C4rLoS
X 0 X

Allora puoi fare in due modi diversi(almeno questi mi sono venuti in mente ora):

1- fai tante chiamate al database, una per ogni campionato che ha un evento...cioè prima ritrovi i campionati che hanno un evento, poi fai un ciclo in modo tale che per ogni campionato aggiunga anche una variabile array aggiungendo gli eventi ad esso associati in modo tale che poi puoi stamparli.

2- fai una unica chiamata che faccia vedere tutti gli eventi e campionati assieme(la query che abbiamo fatto prima), poi con uno script php riordini i risultati e li stampi.

La prima soluzione mi sembra la più semplice ma aumenti il traffico al database, la seconda fai una sola query ma devi crearti uno script di "riordino"...

Non ti ho fatto un esempio diretto prima dovresti decidere come preferisci muoverti.

risposto 7 anni fa
Mario Santagiuliana
X 0 X

allora, scelgo la seconda soluzione, ma vorrei tanto vedere all'opera anche la prima :)

Ricapitoliamo, questo sono le tabelle:

 - campionati (campionato_id, campionato)

 - eventi(evento_id,campionato_id,evento)

D.

Secondo te, è corretto utilizzare la tabella eventi per memorizzare anche il campionato.

o, è preferibile creare una terza tabella per relazionare le prime due (calendario_id, campionato_id, evento_id)

R.

?

Model Campionati:

    function getCampionato()     {

      $select = $this->select()                 ->distinct()                 ->from( array( 'c' => 'campionati'))                 ->join(array('e' => 'eventi'),                              'c.campionato_id = e.campionato_id',array() );                       $select->setIntegrityCheck(false);       return $this->fetchAll($select);     }  

Index.phtml:

   <?php foreach($this->campionati as $campionato) : ?>
    <ul class='campionato' id='id<?php echo $this->escape($campionato->campionato_id);?>'>
        <li><strong><?php echo $this->escape($campionato->campionato);?></strong>     
            <?php foreach($this->eventi as $evento) : ?>
                <ul class='evento' id='id<?php echo $this->escape($evento->evento_id);?>'>
                    <li><i>&nbsp;&nbsp;&nbsp;<?php echo $this->escape($evento['evento']);?> : <?php echo $this->escape($evento['orario']);?></i></li>
                </ul>
            <?php endforeach; ?>
        </li>
    </ul>
    <?php endforeach; ?>

Da Dove inizio ??

risposto 7 anni fa
C4rLoS
modificato 7 anni fa
X 0 X
allora, scelgo la seconda soluzione, ma vorrei tanto vedere all'opera anche la prima :)

Una cosa alla volta  ;)

Ricapitoliamo, questo sono le tabelle:

 - campionati (campionato_id, campionato)

 - eventi(evento_id,campionato_id,evento)

D.

Secondo te, è corretto utilizzare la tabella eventi per memorizzare anche il campionato.

o, è preferibile creare una terza tabella per relazionare le prime due (calendario_id, campionato_id, evento_id)

R.

Come preferisci e come desideri :) per me può andare bene come hai creato, magari puoi aggiungere anche il campo data in eventi.

Se hai tante tabelle con tanti campi che caratterizzano ciascuna tabella puoi creare una terza che faccia da unione, altrimenti inserisci la chiave primaria della prima tabella e la metti come "chiave esterna" nella seconda (e non mi dilungo sul beckend di mysql che si sta utilizzando per creare le relazioni tra tabelle).

Model Campionati:

  

 function getCampionato()
    {

      $select = $this->select()
                ->distinct()
                ->from( array( 'c' => 'campionati'))
                ->join(array('e' => 'eventi'),
                             'c.campionato_id = e.campionato_id',array() );                
      $select->setIntegrityCheck(false); 
      return $this->fetchAll($select);
    }  

Index.phtml:

   <?php foreach($this->campionati as $campionato) : ?>
    <ul class='campionato' id='id<?php echo $this->escape($campionato->campionato_id);?>'>
        <li><strong><?php echo $this->escape($campionato->campionato);?></strong>     
            <?php foreach($this->eventi as $evento) : ?>
                <ul class='evento' id='id<?php echo $this->escape($evento->evento_id);?>'>
                    <li><i>&nbsp;&nbsp;&nbsp;<?php echo $this->escape($evento['evento']);?> : <?php echo $this->escape($evento['orario']);?></i></li>
                </ul>
            <?php endforeach; ?>
        </li>
    </ul>
    <?php endforeach; ?>

Da Dove inizio ??

Direi intanto nella query di ordinare i risultati per campionato.

Poi nel ciclo foreach bisogna aggiungere un controllo per la stampa dei singoli record...ora senza offesa per me è tardi e ho appena finito di studiarmi le anemie...meglio vado a nanna a riposare  e domani vedo di buttare giù una bozza se non lo hai già fatto...

 :bye: :bye:

risposto 7 anni fa
Mario Santagiuliana
X 0 X

Ehi scusami per ieri notte e grazie per l'interessamento.

Poi nel ciclo foreach bisogna aggiungere un controllo per la stampa dei singoli record

Ma intendi nel controller ??? non credo di aver capito.

Una domanda:

Ma nel Controller, posso usare un foreach ed invocare il metodo di un altro model, che a sua volta si trova all'interno di un altro foreach ?? e con this->eventi as $evento, memorizzare la riga ?

In giro non ho trovato nulla, presumo quindi, che non si possa fare :)

risposto 7 anni fa
C4rLoS
X 0 X
Poi nel ciclo foreach bisogna aggiungere un controllo per la stampa dei singoli record

Ma intendi nel controller ??? non credo di aver capito.

No...nella view...nel controller memorizzi solamente l'array del risultato della query giusto?

La view è deputata a tutti gli output, il controller invece fa tutto il resto.

Ma nel Controller, posso usare un foreach ed invocare il metodo di un altro model, che a sua volta si trova all'interno di un altro foreach ?? e con this->eventi as $evento, memorizzare la riga ?

Si...cioè non ho ben capito come...se metti uno spezzone di codice forse capisco...

    function getCampionatoEventi()     {

      $select = $this->select()                 ->from( array( 'c' => 'campionati'))                 ->join(array('e' => 'eventi'),                              'c.campionato_id = e.campionato_id',array() )                 ->order('c.campionato_id DESC');       $select->setIntegrityCheck(false);       return $this->fetchAll($select);     } 

Nel controller:

$champion = new modello_quello_che_è();
$this->view->campionati = $champion->getCampionatoEventi();

Index.phtml:

    <?php $id_precedente = NULL; ?>
    <?php foreach($this->campionati as $campionato) : ?>
        <?php if($campionato->campionato_id != $id_precedente) : ?>
                <ul class='campionato' id='id<?php echo $this->escape($campionato->campionato_id);?>'>
                    <li><strong><?php echo $this->escape($campionato->campionato);?></strong>
         <?php endif; ?>

                            <ul class='evento' id='id<?php echo $this->escape($campionato->evento_id);?>'>
                                <li><i>&nbsp;&nbsp;&nbsp;<?php echo $this->escape($campionato->evento);?> : <?php echo $this->escape($campionato->orario);?></i></li>
                            </ul>

        <?php if($campionato->campionato_id != $id_precedente) : ?>
                    </li>
                </ul>
         <?php endif; ?>

        <?php $id_precedente = $this->campionato->campionato_id; ?>
    <?php endforeach; ?>

Dovrebbe funzionare...

risposto 7 anni fa
Mario Santagiuliana
X 0 X

Pero', finalmente ho capito :)

Ma ce' un errore, dice che non esiste la colonna "evento_id".

exception 'Zend_Db_Table_Row_Exception' with message 'Specified column "evento_id" is not in the row

Infatti il campo si trova nella tabella Eventi.

risposto 7 anni fa
C4rLoS
modificato 7 anni fa
X 0 X

Hai aggiunto la nuova funzione del model come ti ho indicato?

Dovrebbe funzionare perchè si fa un semplice inner join e non si selezionano dei campi particolari....

risposto 7 anni fa
Mario Santagiuliana
X 0 X

Mi rispondo da solo.

Ho aggiunto i campi della tabella nell'array del Join..

->join(array('e' => 'eventi'),
                             'c.campionato_id = e.campionato_id',array('e.evento_id','e.evento') )

Il risultato è perfetto :)

ora pero' ricevo questo messaggio di errore:

Notice: Trying to get property of non-object in C:\xampp\htdocs\lavoro\MyProject\application\views\scripts\index\index.phtml on line 87

sulla riga:

<?php $id_precedente = $this->campionato->campionato_id; ?>
risposto 7 anni fa
C4rLoS
X 0 X

Se si lasciava "array()" in teoria doveva selezionare tutti i campi della tabella...senza necessità di specificarli...devo aver capito male.

L'errore lo ricevi sulla riga che ti ho indicato...scusami...ho sbagliato io a scrivertela, fa così:

<?php $id_precedente = $campionato->campionato_id; ?>
risposto 7 anni fa
Mario Santagiuliana
X 0 X

Perfetto, era proprio quello che volevo:

questo è il risultato:

    *  Serie A

          o    Lazio - Osasuna : 21:00:00

          o    MILAN - INTER : 18:00:00

    * Liga

          o    BARCELLONA - REAL MADRID : 22:00:00

Grazie :)

Ne approfitto, per togliermi ulteriori dubbi. (SCUSAMI) :P

1. Posso relazionare altre tabelle con lo stesso metodo ? cioe', posso usare più Join ??

2. Quindi a questo punto, se posso recuperare tutto con il model Campionati, non ha senso scrivere il model di Eventi. o mi potrebbe servire ??

Grazie 1000 ;)

risposto 7 anni fa
C4rLoS
modificato 7 anni fa
X 0 X
1. Posso relazionare altre tabelle con lo stesso metodo ? cioe', posso usare più Join ??

Certo, leggi pure la documentazione di zend_db_select ufficiale e un manuale sql per capire di più sulle unioni che si possono fare tra tabelle.

2. Quindi a questo punto, se posso recuperare tutto con il model Campionati, non ha senso scrivere il model di Eventi. o mi potrebbe servire ??

Si potresti recuperare il tutto anche con un solo model(infatti all'inizio mi pare di averti anche consigliato non di estendere zend_db_table ma zend_db.

Il vantaggio di creare più model per differenti tabelle sta nell'avere un codice semplificato per la sua gestione(questa è una mia opinione) e creare di conseguenza dei metodi specifici che si applicano solamente a quella tabella...ad esempio se devi aggiornare solamente i dati nella tabella eventi a me sembra stupido dover caricare un oggetto che istanzi anche gli attributi della tabella campionati, creo un modello esteso di zend_db_table per eventi e li inserisco il metodo di aggiornamento...

Non so se mi sono spiegato.

Ciao

risposto 7 anni fa
Mario Santagiuliana
X 0 X

Certo che si.

Uso model separati se devo eseguire metodi specifi solo su quella tabella.

Capito :)

Grazie ;)

risposto 7 anni fa
C4rLoS
modificato 7 anni fa
X 0 X

Mario, e se volessi prendere da una terza tabella

dirette(diretta_id, evento_id, canale)

le dirette di un determinato evento e visualizzarli a video se c'e' corrispondeza, come dovrei muovermi ??

ho cercato di fare un copia incolla della struttura getCampionatiEventi, modificando tabelle e campi,

ma come mi è capito prima, visualizzo per ciascun evento, tutte le dirette presenti nella tabella.

mi sa' che mi sfugge qualcosa ??

che libro mi consigli di leggere ? :)

questo è il mio nuovo metodo:

    function getEventiDirette()
    {
      $select = $this->select()
                ->from( array('e' => 'eventi'))
                ->join(array('d' => 'dirette'),
                             'e.evento_id = d.evento_id',array('d.diretta_id','d.canale','d.link') )
                ->order('e.orario ASC');
      $select->setIntegrityCheck(false); 
      return $this->fetchAll($select);
    }  

questo il codice che ho integrato

questo è il codice che ho integrato su index.phtml

<?php $id_campionato_precedente = NULL; ?>

    <?php foreach($this->campionati as $campionato) : ?>

        <?php if($campionato->campionato_id != $id_campionato_precedente) : ?>

                <ul class='campionato' id='id<?php echo $this->escape($campionato->campionato_id);?>'>

                    <li><img width='16' height='16' src='public/images/icon16x16/campionati/b_<?php echo $this->escape($campionato->icon);?>' title='link ufficiale' alt='<?php echo $this->escape($campionato->campionato);?>'/><strong><?php echo $this->escape($campionato->campionato);?> <small><a href='<?php echo $this->escape($campionato->link);?>'><img src='public/images/icon16x16/varie/external_link.png' alt='Link Ufficiale' /></a></small></strong>

         <?php endif; ?>

                            <ul class='evento' id='id<?php echo $this->escape($campionato->evento_id);?>'>

                                <li><i>&nbsp;&nbsp;&nbsp;<?php echo $this->escape($campionato->evento);?> : <?php echo $this->escape($campionato->orario);?></i>

                            <?php $id_evento_precedente = NULL; ?>                             <?php foreach($this->eventi as $evento) : ?>                             <?php if($evento->evento_id != $id_evento_precedente) : ?>                                 <ul class='diretta' id='id<?php echo $this->escape($evento->diretta_id);?>'>                                     <li><i>&nbsp;&nbsp;&nbsp;<?php echo $this->escape($evento->canale);?>: <a hreg='<?php echo $this->escape($evento->link);?>'>1</a></i></li>                             <?php endif; ?>                                     <?php if($evento->evento_id != $id_evento_precedente) : ?>                                     </li>                                 </ul>                             <?php endif; ?>                                    <?php $id_evento_precedente = $evento->evento_id; ?>                             <?php endforeach; ?>

                                </li>

                            </ul>

        <?php if($campionato->campionato_id != $id_campionato_precedente) : ?>

                    </li>

                </ul>

        <?php endif; ?>       

        <?php $id_campionato_precedente = $campionato->campionato_id; ?>

    <?php endforeach; ?>

risposto 7 anni fa
C4rLoS
modificato 7 anni fa
X 0 X

Cioè vuoi fare il join fra la tabella eventi e la tabella dirette o fra tutte e 3 le tabelle...non ho capito...scusami  :-[

che libro mi consigli di leggere ? Smiley

Libro per cosa in specifico? Zend Framework, Sql....

Io per dir la verità non uso libri...cioè alle superiori ho usato un libro di introduzione sulle basi dati...forse si chiamava "Fondamenti di basi di dati"...ma potrei sbagliarmi...

Per Zend Framework al momento mi baso sulla documentazione ufficiale, però il libro più completo deve essere questo:

http://www.zendframeworkinaction.com/

Ciao

risposto 7 anni fa
Mario Santagiuliana
X 0 X

Ah hai appena modificato il tuo messaggio...scusami...

risposto 7 anni fa
Mario Santagiuliana
X 0 X
Cioè vuoi fare il join fra la tabella eventi e la tabella dirette o fra tutte e 3 le tabelle...non ho capito...scusami  Embarrassed

Mmm la mia intenzione è quella di visualizzare i canali che trasmettono quell'evento. altrimenti non deve uscire nulla.. solo l'evento.

risposto 7 anni fa
C4rLoS
X 0 X

Allora non occorre fai una query di join...

Cioè ricavi i record dal database e li spari dentro ad un array.

Poi puoi far vedere il canale come se fosse un array...cioè quando si arriva a stampare il canale puoi fare:

if($this->canali['$evento->evento_id'])
  echo $this->canali['$evento->evento_id']

L'ho buttata molto li e la sintassi è da correggere...però una cosa del genere no?

Può essere?

Altrimenti fare un join di 3 tabelle...

Ciao

risposto 7 anni fa
Mario Santagiuliana
X 0 X

si..metto giu' un po' di codice e ti faccio sapere ;)

ciao

risposto 7 anni fa
C4rLoS
X 0 X

Ehi, ci sono riuscito.

ti posto il codice, cosi mi dici se la soluzione che ho adottato è quella migliore

controller.phtml

   function getEventiDirette()
    {
      $select = $this->select()
                ->distinct()
                ->from(array('d' => 'dirette'))
                ->join(array('e' => 'eventi'),
                      'd.evento_id = e.evento_id',array());
      $select->setIntegrityCheck(false); 
      return $this->fetchAll($select);
    }  

index.phtml

                                   <?php foreach($this->eventi as $evento) : ?>
                                        <?php if($campionato->evento_id == $evento->evento_id) : ?>
                                        <ul>
                                            <li><?php echo $this->escape($evento->canale);?></li>
                                        </ul>
                                        <?php endif; ?>
                                    <?php endforeach;?>
risposto 7 anni fa
C4rLoS
modificato 7 anni fa
X 0 X

Ehi, ci sono riuscito.

ti posto il codice, cosi mi dici se la soluzione che ho adottato è quella migliore

La soluzione che hai adottato fa quello che ti interessa?

Allora è la soluzione corretta  ;)

Certo se vuoi migliorare le prestazioni del tuo script allora bisognerà creare un algoritmo differente(passare tutte le volte l'intero array fa perdere tempo) ma anche così non perdi molto in qualità, credo... ;)

risposto 7 anni fa
Mario Santagiuliana
X 0 X

tnx ;)

risposto 7 anni fa
C4rLoS
X 0 X

Salve,

ho bisogno di aiuto.

Ho due tabelle.

Articoli(id,titolo,testo,idcategoria) (ho inserito solo i campi principali)

Categoria(id, nome)

se utilizzo questo metodo:

$results = $articoli->getAllArticoli()

Estrapolo dal database tutti i records, compreso il valore della colonna idcategoria (es. 2)

ID = 2 corrisponde nella tabella "Categoria" alla categoria "Blog".

avendo queste informazioni, voglio stampare nella pagina view.phtml, il nome della categoria, anzichè il suo id.

ho creato questo nuovo metodo:

$categorie->getCategoriaArt(?)

che dovrebbe prendere l'idcategoria della tabella articolo, confrontarlo con l'id della tabella categoria ed estrapolare la riga che soddisfa il criterio (mostrando in seguito il nome della categoria con il codice:

<?php echo $this->escape($this->catart['nome']);?>

ma non capisco come passare il parametro.

Aiuto please.

Grazie

risposto 7 anni fa
C4rLoS
X 0 X

Puoi fare vedere il codice della tua action?

risposto 7 anni fa
Mario Santagiuliana
X 0 X

Ciao.

Problema risolto.

ho creato una join direttamente nel metodo: getAllArticoli() giocando con i campi ID.

riuscendo in questo modo, a stampare il titolo della categoria.

    function getAllArticoli($localhost,$username,$pass,$dbname)
    {
       $params = array('host'=>$localhost, 'username'=>$username, 'password'=>$pass, 'dbname'=>$dbname);           
       $db = Zend_Db::factory('PDO_MYSQL', $params);
      $result = $db->query(
         'SELECT * FROM articoli AS a, categorie AS c WHERE a.catid = c.id');
      $rows = $result->fetchAll();
      return $rows;       
    }

scusami.

Carlo

risposto 7 anni fa
C4rLoS
X 0 X

MMM... non completamente :P

ho notato, che se entrambe le tabelle hanno dei campi in comune(es. stato per articolo e stato per categoria)

lui va in confusione.

devo indicare dopo SELECT quali campi estrapolare, vero ??

risposto 7 anni fa
C4rLoS
modificato 7 anni fa
X 0 X

Indica chiaramente il "percorso" del campo, con sintassi del tipo tabella.campo.

Poi potresti creare la query utilizzando il "comando" AS di sql in modo da non confonderti.

risposto 7 anni fa
Mario Santagiuliana
X 0 X

Si infatti,

è quello che ho fatto :)

grazie

ciao

risposto 7 anni fa
C4rLoS
X 0 X
Effettua l'accesso o registrati per rispondere a questa domanda

Domande simili