2016-06-12 2 views
0

Fondamentalement, j'ai une relation N: M (entre les tables "plans" et "abonnements"). Les clés primaires Plans et Abonnements sont les clés primaires de cette relation N: M, cette relation N: M a également un attribut "prix". Puisque j'ai besoin de mettre à jour l'attribut de prix sur cette table, je ne peux pas comprendre comment y accéder avec les classes générées par Propel. Comme je peux le voir, il semble que les classes Plan et Abonnement n'ont aucune méthode qui me permet de faire ce dont j'ai besoin.Comment puis-je accéder à une valeur de clé non primaire dans une table CrossRef générée par Propel?

Ceci est la partie de mon schema.xml où sont déclarés ces relations d'arbres (plans, abonnements et leurs CrossRef)

<table name="subscriptions" phpName="Subscription"> 
    <column name="id_subscription" type="integer" required="true" primaryKey="true" autoIncrement="true"/> 
    <column name="name" type="varchar" required="true"/> 
    <column name="description" type="longvarchar" required="true"/> 
</table> 

<table name="planes_subscriptions" isCrossRef="true"> 
    <column name="id_plan" type="integer" primaryKey="true"/> 
    <column name="id_subscription" type="integer" primaryKey="true"/> 
    <column name="price" type="real"/> 

    <foreign-key foreignTable="planes" onDelete="CASCADE" onUpdate="CASCADE"> 
     <reference local="id_plan" foreign="id_plan"/> 
    </foreign-key> 
    <foreign-key foreignTable="subscriptions" onDelete="CASCADE" onUpdate="CASCADE"> 
     <reference local="id_subscription" foreign="id_subscription"/> 
    </foreign-key> 
</table> 

<table name="planes" phpName="Plan"> 
    <column name="id_plan" type="integer" required="true" primaryKey="true" autoIncrement="true"/> 
    <column name="name" type="varchar" required="true"/> 
    <column name="description" type="longvarchar" required="false"/> 
    <column name="price" type="real" required="true"/> 
</table> 

Je pensais que je pourrais avoir à coder des trucs sur les classes générées Propel pour le faire, mais je ne peux pas comprendre comment accéder à une ligne de cette table par ses clés primaires non plus.

J'ai fait des recherches sur la documentation de Propel, mais ils ne traitent pas ce cas particulier:

Blog: Many-to-many Relationships: Check!

Basic Relationships

Répondre

0

Il était question d'une nuit (en fait un matin à l'aube) de bon sommeil et re-recherche cela.

Il est possible de mettre à jour des objets avec les méthodes générées par Propel. Je viens de filtrer mon ObjectQuery (PlansSubscriptionsQuery) par ses Primaires clés

// Create planSuscription query 
$planSubscription = PlanesSubscriptionsQuery::create()-> 
// filter the query by plan and subscription ids 
filterByIdPlan($idPlan)->filterByIdSubscription($idSuscripcion)-> 
// Magic comes here: an associative array with the value to update 
update(array('Price' => $newSubscriptionPrice)); 
// Just checking amount of affected rows 
echo $planSuscripcion; 

IMPORTANT: Notez que dans le tableau associatif, la valeur de la colonne commence par une lettre majuscule (P riz). Pour autant que je puisse voir, c'est parce que Propel fonctionne de cette façon avec cela. Dans le cas où le nom de votre colonne est composé de deux mots ou plus, chaque mot de première lettre sera capilatisé: par ex. I d P riz ou M y S uper A wesome C OLONNE N amme

I found a question here that made me realize of this, mon fichier schema.xml était correct mais je tente d'accéder à la colonne avec le nom souligné dans le fichier schema.xml (price, id_plan, id_subscription et ainsi de suite) qui n'est pas correct.

J'espère que cela aide quelqu'un.