2012-04-26 5 views
0

J'ai essayé ceci: http://www.yiiframework.com/wiki/285/accessing-data-in-a-join-table-with-the-related-modelsBases de données relationnelles dans Yii

Fondamentalement, j'avoir une table appelée utilisateur qui se rapporte à ToolAccess; lié via une clé primaire sur l'utilisateur et un champ pour userID sur ToolAccess. L'accès à l'outil se rapporte maintenant à l'outil de la table qui contient un ToolID. Maintenant cela ne fonctionne pas dans Yii, je n'arrive pas à obtenir le champ toolName de la table d'outils en utilisant Yii. Des idées sur la façon de faire cela sur un enregistrement actif? J'utilise giix si cela est important.

Relations Code:

public function relations() { 
    return array(
     'usergalleries' => array(self::HAS_MANY, 'Usergallery', 'userid'), 
     'userinroles' => array(self::HAS_MANY, 'Userinroles', 'userid'), 
     'userfailedlogin' => array(self::HAS_MANY, 'Userfailedlogin','userid'), 
     // table name, relation, class name, relation key 
     'toolaccess' =>array(self::HAS_MANY, 'Toolaccess','userid'), 
     'tool' =>array(self::HAS_MANY, 'Tool','toolid') 
    ); 
} 
+0

Mais quel est le problème que vous rencontrez? – Puigcerber

+0

Je ne sais pas comment je peux obtenir la valeur de la colonne du nom de l'outil –

+0

Ok, je n'ai pas compris au début. Et comment sont liés toolaccess et outil? Par tool? – Puigcerber

Répondre

1

Je suppose que votre schéma ressemble à quelque chose comme ceci:

User table    tool_access table   Tool table 

id | other columns  userid | toolid   id | name | other columns 

Dans ce cas, le modèle User devrait avoir une relation comme celui-ci (notez que les outils seront classés par ordre alphabétique dans ce cas):

public function relations() { 
    return array(
     // other relations here... 
     'tools' =>array(self::MANY_MANY, 'Tool', 'tool_access(userid,toolid)', 
      'order' => 'tools.name', 
     ), 
    ); 
} 

et le code pour lire les outils devrait ressembler à ceci:

$user = User::model()->with('tools')->findByPk($id); 
foreach($user->tools as $tool) { 
    echo $tool->name; 
} 

J'ai utilisé le chargement impatient de la tools ici principalement en raison de préférences personnelles, l'utilisation de chargement paresseux devrait fonctionner aussi bien dans ce cas. Mais le chargement impatient devrait être préféré chaque fois que vous traitez plusieurs enregistrements User à la fois.

+0

Où puis-je lire plus loin? Je vous remercie! –

+0

@Snow_Mac: J'ai appris principalement à partir de ces liens: Le guide définitif de Yii: [Enregistrement actif] (http://www.yiiframework.com/doc/guide/1.1/fr/database.ar) - [Enregistrement actif relationnel] (http://www.yiiframework.com/doc/guide/1.1/fr/database.arr), des essais et des erreurs, et en passant par le code avec xdebug (bien que cela ne devrait pas être nécessaire pour les débutants). L'outil générateur de code 'gii' peut générer les classes Active Record pour vous, et si votre schéma de base de données inclut des clés étrangères (il * really * devrait, pour des raisons d'intégrité des données), il peut les utiliser pour inférer automatiquement ces relations. – DCoder

0

Donc, si je comprends correctement, l'utilisateur et l'outil sont liés à plusieurs-à-plusieurs par leurs clés primaires.

Vous devez définir cette relation dans le modèle de l'utilisateur comme:

'tools' => array(self::MANY_MANY, 'Tool', 'tool_access(userid, toolid)', 'index' => 'id'), 

De cette façon, vous pouvez accéder au nom de l'outil après avoir obtenu le modèle utilisateur

$user = User::model->findByPk($id); 
$tools = $user->tools; 
foreach ($tools as $tool) 
{ 
    echo $tool->name; 
} 

J'espère que cela fonctionne pour toi.

+0

L'accès utilisateur et outil est lié via le champ USERID. L'outil et l'utilisateur ne sont pas liés, mais l'accès aux outils et outils est lié. –

+0

Pouvez-vous poster votre schéma de base de données? – Puigcerber

Questions connexes