2009-07-29 12 views
0

J'ai deux tables liées via un HABTM. pays & réseaux. Ils sont liés par la table de recherche countries_networks.Structure de tableau CakePHP à partir d'une requête HABTM

Je dois obtenir tous les pays et tous les identifiants de réseau associés pour chaque pays correspondant. Je n'ai pas besoin d'aller aussi loin que d'obtenir les noms de réseau, simplement obtenir les identifiants de la table de recherche suffira.

Si je fais une recherche (tous) cela me donne un tableau de pays mais pas dans la structure dont j'ai besoin. Je dois retourner lien quelque chose cela, mais je ne besoin Country.countryName et CountriesNetwork.network_id:

Array 
(
    [0] => Array 
     (
      [Country] => Array 
       (
        [countryName] => Aeroplane 
       ) 
      [Network] => Array 
       (
        [0] => Array 
         (
          [id] => 1 
          [CountriesNetwork] => Array 
           (
            [id] => 1 
            [country_id] => 1 
            [network_id] => 1 
           ) 
         ) 

        [1] => Array 
         (
          [id] => 7 
          [CountriesNetwork] => Array 
           (
            [id] => 2 
            [country_id] => 1 
            [network_id] => 7 
           ) 
         ) 
       ) 
     ) 
) 

Est-il possible de le faire avec un findall()? Comme si je transmettais des champs sous forme de tableau, j'ai toujours l'impression d'avoir une colonne SQL inconnue. Ou même une requête personnalisée? Merci d'avance à tous ceux qui pourraient vous aider.

Répondre

1

Pickledegg,

On dirait que vous devriez étudier le comportement maîtrisable. Il vous permettra de spécifier des conditions sur les modèles joints comme vous le souhaitez, et retournera les données formatées de la même manière que l'appel find() normal.

Consultez le manuel pour plus d'informations.

+0

containable a fait l'affaire, cela combiné avec le set :: extract :) –

1

Comme vous n'avez pas de modèle pour network_countries, vous ne pouvez pas obtenir ces valeurs en utilisant find ou findAll. Je pense que la solution la plus simple sera d'exécuter une requête personnalisée pour récupérer les données dont vous avez besoin.

$query = "SELECT country_id, network_id 
FROM countries C LEFT JOIN network_countries NC ON (NC.country_id = C.id)" 
$this->Country->query($query); 

Malheureusement, le résultat renvoyé en utilisant ce code sera formaté légèrement différent alors find résultats.

Ou vous pourriez ajouter un modèle pour les pays du réseau, mais je ne pense pas que ce soit une bonne idée.

+0

Merci RaYell, j'ai essayé cela, mais il me donne des pays en double alors, je veux que le format soit 'CountryName', avec un tableau de noms ou de noms de réseau. –

+0

Oui, il duplique les pays car c'est comme ça que LEFT JOIN fonctionne, mais je ne sais pas si vous pouvez le faire plus simplement que cela. Je suppose que vous pourriez obtenir des pays et ensuite, pour chaque pays, lancer une requête pour obtenir des identifiants de réseau, mais cela nécessitera beaucoup de requêtes au lieu d'une. Vous pouvez toujours trier les résultats par country_id et parcourir sur le résultat et juste vérifier si country_id de la rangée actuelle a changé, je ne peux pas penser à quelque chose de plus simple que j'ai peur – RaYell

+0

merci beaucoup :) –

Questions connexes