2015-08-17 19 views
5

Sono nuovo con CakePHP e sto cercando di creare query complesse per i risultati. Mi sta uccidendo. Forse un po '1 può aiutarmi qui con quello. Sto usando la torta 2,7Come creare la query CakePHP corretta per le relazioni nidificate

Ho due tabelle con 3 relazioni (molte a molte). Neighbourhood e Polygon. Un aspetto simile a questo Neighbourhood ha molti Neighbourhoods e appartiene anche a molti Neighbourhoods. Anche Neighbourhood ha molti Polygons e Polygon appartengono a mnay Neighbourhoods.

Neighbourhood tabella contiene 2 campi name e zip. Quello che ottengo dall'utente è zip code.

E ora quello che voglio: voglio ottenere tutte Polygons da Neighbourhood ed è Neighbours. Dove Neighbourhood.zip = defined by user.

Come posso farlo? Devo scrivere una query personalizzata o dividere il processo in passi più piccoli? Sto combattendo con questo tutto il giorno.

Ecco come modelli di relazioni piace guardare:

class Neighbourhood extends AppModel 
{ 
    var $hasAndBelongsToMany = array(
     'Neighbourhoods' => array(
      'className' => 'Neighbourhood', 
      'joinTable' => 'neighbourhoods_neighbours', 
      'foreignKey' => 'neighbourhood_id', 
      'associationForeignKey' => 'neighbour_id', 
      'unique' => false 
     ), 
     'Polygon' => array(
      'className' => 'Polygon', 
      'joinTable' => 'neighbourhoods_polygons', 
      'foreignKey' => 'neighbourhood_id', 
      'associationForeignKey' => 'polygon_id', 
      'unique' => false 
     ), 
    ); 
} 


class Polygon extends AppModel 
{ 
    var $hasAndBelongsToMany = array(
     'Neighbours' => array(
      'className' => 'Neighbourhood', 
      'joinTable' => 'neighbourhoods_polygons', 
      'foreignKey' => 'polygon_id', 
      'associationForeignKey' => 'neighbourhood_id', 
      'unique' => false, 
     ) 
    ); 
} 

risposta

1

devi abilitare il comportamento contenibile nei tuoi modelli o meglio ancora una volta messo in voi modello di applicazione.

public $actsAs = array('Containable'); 

E quindi iniziare a creare le vostre domande, ad es.

$conditions = array(
    'conditions' => array('id' => '123'), 
    'contain' => array(
     'Neighbourhood'=>array(
       'conditions' => array('Neighbourhood.id' => '123') 
     ) 
    ), 
    // or even joins 
    'joins' => array(
      array(
        'table' => $this->getTableName('default', 'neighbourhoods'), 
        'alias' => 'Neighbourhood', 
        'type' => 'RIGHT', // OR LEFT 
        'conditions' => array(
         'Neighbourhood.id = Polygon.neighbourhood_id', 
         'Neighbourhood.deleted' => 0, 
        ) 
     ) 
    ) 
); 

$polygons = $this->Polygon->find('all', $conditions); 

Se si pensa che questo non fa abbastanza (per fare domande più complesse), allora si avrebbe bisogno di costruire i istruzioni di query. per esempio. l'esecuzione di una query da poligono modello:

$dbo = $this->getDataSource(); 
    $query = $dbo->buildStatement(
      array(
       'fields' => array(
        'Polygon.name AS polygon_name', 'Polygon.size', 
        'Neighbourhood.name AS neighbourhood_name', 'Neighbourhood.lat', 
        'IF(Neighbourhood.created > DATE_SUB(NOW(), INTERVAL 1 DAY) , 1 , 0) AS new_neighbourhood' 
       ), 
       'table' => $dbo->fullTableName($this), 
       'alias' => 'Polygon', 
       'limit' => null, 
       'offset' => null, 
       'joins' => array(
        array(
         'table' => $this->getTableName('default', 'neighbourhoods'), 
         'alias' => 'Neighbourhood', 
         'type' => 'LEFT', 
         'conditions' => array(
          'Neighbourhood.id = Polygon.neighbourhood_id', 
         ), 
         'order' => 'Neighbourhood.name ASC', 
        ), 
        .... 
       ), 
       'conditions' => $conditions, 
       'group' => 'Polygon.name', 
       'order' => 'Polygon.name ASC', 
      ), 
      $this 
    ); 

$polygons = $this->query($query); 

E se pensate che anche questo non è sufficiente, allora si deve cantare grazia sorprendente come questo ..

$polygons = $this->query("Here your sql query"); 

debug($polygons); 
+1

riesco a creare una query la tua strada che ha funzionato Grazie per avermi mostrato un modo – Vardius

+0

Il mio piacere. a mente questo è per cakephp 2.x che non hai molta flessibilità. Ma in cakephp 3.x che è ORM sei libero di fare quasi tutto molto più semplice. – Fury

+0

Framework e versione non erano la mia scelta, era una scelta del cliente. faccio come mi è stato detto. – Vardius