2010-08-11 17 views
2

J'essaie d'utiliser les associations à la volée pour réduire les données que je récupère, mais le modèle que j'utilise est associé à d'autres modèles avec un champ nommé à nouveau parce que j'ai 2 des mêmes modèles qui lui sont associés. Donc, voici le modèle, par exemple 'test', qui a deux champs 'user', tous deux liés au modèle User.CakePhp: associations à la volée utilisant un champ Modèle renommé?

Dans le modèle:

var $belongsTo = array( 
    'User' => array(
     'className' => 'User', 
     'foreignKey' => 'user_id' 
    ), 
    'User_Watched' => array(
     'className' => 'User', 
     'foreignKey' => 'user_id_watched' 
    ) 
); 

Lorsque je récupère les données relatives à « test », je veux récupérer uniquement les données particulières liés aux champs « User » et « » User_Watched sans aucune autre information imbriquée.

Mais quand je fais:

$this->User->unbindModel(array('hasMany' => array('something1', 'something2')), false); 

puis something1 et les données de something2 ne montre pas le « Utilisateur » champ de modèle « test », mais est toujours récupérée pour le champ « User_watched ». Puis-je ne pas récupérer de données indésirables pour le champ 'User_watched'?

Hope this sens ... :)

Répondre

2

à utiliser sur les associations de mouches pour couper bas les données que je récupère

Bonne idée.

'foreignKey' => 'user_id_watched' 

devrait peut-être:

'foreignKey' => 'user_watched_id'.

Édition 1: Au moins, cela aurait du sens selon ma compréhension actuelle. Si user_id est une clé étrangère correcte (FK), que cakephp utilise pour dissocier les relations, mais user_id_watched n'est pas, que votre comportement décrit est expliqué.

Édition 2: Le comportement Contenable vous donne un autre outil pour contrôler les modèles associés.

+0

Merci, benjamin. Pourquoi cela devrait-il se terminer par 'id'? Le champ réel dans le modèle 'Test' est 'user_id_watched'. J'ai résolu cela en utilisant 'joins'. – KcYxA

+0

Hello KcYxA, Cakephp utilise l'approche 'Convention over Configuration', ce qui signifie que si un développeur s'en tient à certaines conventions, cakephp en échange réduit la quantité de configuration nécessaire. Dans le cas présent, 'user_id_watched' fonctionne comme un FK. FK dans cakephp devrait suivre la convention, donc le nom de champ dans la table devrait être 'user_watched_id'. Alors bien sûr, toutes les occurrences de l'ancien nom doivent être changées en conséquence. Si cela fonctionne pour vous, s'il vous plaît faites le moi savoir afin que je puisse faire fondre ce commentaire dans la réponse ci-dessus. Cordialement, Benjamin. – benjamin

2

KcYxA,

comportement maîtrisable pourrait aider beaucoup dans ce cas, comme mentionné benjamin, votre « trouver » requêtes ressemblerait à ceci:

$this->User->find('first', array(
     'conditions' => array('User.id' => $id), 
     'contain' => array('UserWatched') 
    )); 

Dans ce cas, vous ne devez utilisez la méthode unbindModel. Dans cet exemple, vous obtiendrez des données User et UserWatched. Si vous n'avez besoin que des données utilisateur de "find", dites "Cake to" $ this-> User-> contain(); " donc il ne va pas aller plus loin que le modèle de l'utilisateur.

+0

Merci. J'ai fini par utiliser une jointure. – KcYxA

+1

KcYxA, L'utilisation de SQL "manuscrit" devrait être le dernier recours, car il contourne l'abstraction de la couche de base de données sous-jacente. En d'autres termes, un développeur, qui a directement introduit des instructions SQL, doit les réécrire lorsqu'il passe à une autre base de données/source de données. Cordialement, Benjamin. – benjamin

+0

jujav4ik, il est toujours écrit en utilisant la convention de CakePHP, où l'on ajoute un tableau 'join' aux paramètres de la méthode 'find'. Mais je comprends et suis d'accord avec votre argument. – KcYxA

0

Change primaryKey $ en vol, contrôleur exécuter Exemple:

// Modèles

// ....

classe PreProductoDescripcion extends AppModel {

/** 
* Primary key field 
* 
* @var string 
*/ 
public $primaryKey = 'id_producto_descripcion'; 

//.... 
//.... 

}

SenasaPedidosDetalles classe extends AppModel {

/** 
* Display field 
* 
* @var string 
*/ 
public $displayField = 'cod_tango'; 

public $belongsTo = array(
    'SenasaPedidos' => array(
     'className' => 'SenasaPedidos', 
     'foreignKey' => 'senasa_pedidos_id', 
     'conditions' => '', 
     'fields' => '', 
     'order' => '' 
    ), 
    'PreProductoDescripcion' => array(
     'className' => 'PreProductoDescripcion', 
     'foreignKey' => 'cod_tango', 
     //'conditions' => array('SenasaPedidosDetalles.cod_tango' => 'PreProductoDescripcion.codigo'), 
     'fields' => '', 
     'order' => '' 
    ) 
); 

// ....

#
// Controller Fly 
//... 
$this->SenasaPedidos->Behaviors->load('Containable'); 
$this->SenasaPedidos->SenasaPedidosDetalles->PreProductoDescripcion->primaryKey = 'codigo'; 
        $datos = $this->SenasaPedidos->find(
          'first', array(
         'fields' => array('SenasaPedidos.*'), 
         'conditions' => array('SenasaPedidos.id' => $id), 
         'contain' => array(
          'Usuarios' => array(
           'fields' => array('Usuarios.apellido_nombre') 
          ), 
          'Clientes' => array(
           'fields' => array('Clientes.razon_social') 
          ), 
          'Provincias' => array(
           'fields' => array('Provincias.nombre') 
          ), 
          'Transportes' => array(
           'fields' => array('Transportes.razon_social') 
          ), 
          'SenasaPedidosDetalles' => array(
           'fields' => array('SenasaPedidosDetalles.*'), 
           'PreProductoDescripcion' => array(
            'fields' => array(
             'PreProductoDescripcion.id_producto_descripcion', 
             'PreProductoDescripcion.descripcion' 
            ) 
           ) 
          ), 
         ) 
        )); 
//... 
Questions connexes