2010-11-05 5 views
4

Je suis nouveau à Yii php framework. Je connais le framework python - django et j'ai réussi à créer une application basée sur le pattern MVC avec la base de données. Maintenant, je voudrais créer un autre projet/application dans le cadre php - j'essayais symfony, mais maintenant je veux essayer le Yii. Mon problème/question est de savoir comment écrire les requêtes dans le langage d'enregistrement actif de Yii. Je lis beaucoup de documentation et essaye certaines choses en utilisant le shell de Yii (yiic shell config/main.php), mais sans obtenir les résultats que je veux. J'ai trois tables - A, B et C où la table C contient seulement des clés étrangères des tables A et B (leurs identifiants). Je veux avoir une relation plusieurs-à-plusieurs en n'utilisant que la troisième table (tableau C). Je suis intrigué par comment obtenir certains éléments/enregistrements de la table A (par exemple les enregistrements qui contiennent un nom - en SQL ce serait quelque chose comme ... nom LIKE xy), puis chercher leurs identifiants dans la table C et trouver tous les identifiants correspondants (paires) et enfin avec les identifiants de B pour extraire plus d'informations sur les identifiants spécifiques de la table B. Merci beaucoup pour le temps que vous avez passé à lire ceci et merci encore de m'avoir fourni quelques informations utiles.Yii - bases de données - problème d'enregistrement actif

P.S .: si vous trouvez quelque chose de mal concernant mon anglais, s'il vous plaît faites le moi savoir - je voudrais aller mieux avec mon anglais.

+0

Est-ce que ma réponse aider à répondre à votre question? – thaddeusmt

Répondre

7

Je suppose que vous avez lu cette page dans le manuel déjà (sinon, faites-le maintenant!): http://www.yiiframework.com/doc/guide/1.1/en/database.arr

Quoi qu'il en soit, vous avez deux modèles (AMODEL et BModel) et une structure de table comme ceci:

TableA (table for AModel) 
-a_id (primary key) 
-otherfieldsA 

TableB (table for BModel) 
-b_id (primary key) 
-otherfieldsB 

TableC (relation table) 
-a_id (foreign key in TableA) 
-b_id (foreign key in TableB) 

en AMODEL, ajoutez la relation MANY_MANY suivante:

public function relations() 
{ 
    return array(
    'BModels' => array(self::MANY_MANY, 'BModel', 'TableC(a_id, b_id)') 
); 
} 

Et BModel, ajoutez la relation MANY_MANY suivante:

public function relations() 
{ 
    return array(
    'AModels' => array(self::MANY_MANY, 'AModel', 'TableC(b_id, a_id)') 
); 
} 

Maintenant, pour obtenir tous les BModels liés à AMODEL, vous pouvez le faire:

$myAmodel = AModel::model()->findbyPk('1'); // give an id of an A model here 
foreach($myAmodel->BModels as $aBmodel) { // get all of the related B's and loop 
    echo $aBmodel->otherfieldsB; // access data from the related B model 
} 

Et Vica versa:

$myBmodel = BModel::model()->findbyPk('1'); // give an id of an B model here 
foreach($myBmodel->AModels as $anAmodel) { // get all of the related A's and loop 
    echo $anAmodel->otherfieldsA; // access data from the related A model 
} 

Note: Cela ne résout pas les problèmes de définir et assigner de nouvelles relations cependant, juste obtenir des données de relations existantes. Pour créer nouvelles relations MANY_MANY vous aurez besoin d'un code personnalisé pour faire les widgets de sélection de formulaire, et pour enregistrer et mettre à jour la table de relation (SQL personnalisé dans les méthodes afterSave() des modèles, généralement).

Il y a quelques extensions dans le référentiel d'extension Yû qui fournissent Behaviors qui rendent cela plus facile si, comme ce qui suit:

+0

Maintenant, pour ajouter une entrée à la table de relations MANY_MANY? Je reçois toujours l'erreur de contrainte de clé étrangère :( –

+0

Il existe quelques extensions pratiques qui rendent cela plus facile (http://www.yiiframework.com/search/?q=many_many&type=extension) .Au fond, dans votre méthode afterSave() vous juste Vous avez besoin de faire quelques insertions de base de données, soit directement avec SQL, soit en créant un modèle AR pour votre table de relations, et enregistrez-le (comme ceci: http://www.yiiframework.com/forum/index.php?/ topic/8170-best-method-for-saving-many-many-records) – thaddeusmt