2011-05-22 15 views
8

En mi aplicación CakePHP tengo modelos para partidos y equipos. Cada partida tiene un home_team_id y un away_team_id, ambos hacen referencia a un equipo diferente.Relación modelo de CakePHP con llaves extranjeras múltiples

En mi archivo team.php, yo soy capaz de formar la relación de partidos en casa de un equipo:

var $hasMany = array(
    'HomeMatch' => array('className' => 'Match', 'foreignKey' => 'home_team_id'), 
    'AwayMatch' => array('className' => 'Match', 'foreignKey' => 'away_team_id') 
); 

Mi problema es que no puedo recuperar automáticamente la casa de un equipo y partidos como visitante en una sola matriz. Es decir, los Partidos recuperados se devuelven en matrices separadas de HomeMatch y AwayMatch, lo que causa dificultades de clasificación.

he intentado lo siguiente:

var $hasMany = array(
    'Match' => array('foreignKey' => array('home_team_id', 'away_team_id')) 
); 

... sin suerte.

¿Alguna idea sobre cómo combinar estas dos claves foráneas en una sola relación?

Gracias, Ben

Respuesta

13

Una costumbre finderQuery debe hacer el truco:

public $hasMany = array(
    'Match' => array(
     'className' => 'Match', 
     'foreignKey' => false, 
     'finderQuery' => 'SELECT * 
          FROM `matches` as `Match` 
          WHERE `Match`.`home_team_id` = {$__cakeID__$} 
           OR `Match`.`away_team_id` = {$__cakeID__$}' 
    ) 
); 
+0

Gracias, eso es perfecto! – Ben

+0

Esto fue increíble. –

0

Se devuelven en orden de separada debido a que el tipo de representan modelos diferentes (en este caso particular, el modelo es el mismo).

Probablemente deberías construir un método auxiliar para repasar los datos recuperados (en el objeto modelo o en una clase auxiliar separada) y "aplanarlo". entonces podrías ordenarlo.

Ken.

8

que estaba teniendo un problema similar y en lugar de crear una finderQuery utilicé el operador conditions y funcionó muy bien!

public $hasMany = array(
    'Match' => array(
     'className' => 'Match', 
     'foreignKey' => false, 
     'conditions' => array(
      'OR' => array(
       array('Match.home_team_id' => '{$__cakeID__$}'), 
       array('Match.away_team_id' => '{$__cakeID__$}') 
      ) 
     ), 
    ) 
); 
Cuestiones relacionadas