2010-06-28 6 views
0

modèles suivants:DQL Mise à jour des relations

class User extends Doctrine_Record { 
    public function setTableDefinition() { 
     $this->hasColumn ('iron', 'integer', 4); 
    } 

    public function setUp() { 
     $this->hasMany ('Field as Fields', array(
      'local' => 'id', 
      'foreign' => 'owner_id' 
     )); 
    } 
} 

class Field extends Doctrine_Record { 
    public function setTableDefinition() { 
     $this->hasColumn('owner_id','integer',4); 
     $this->hasColumn('ressource_id','integer',4); 
     $this->hasColumn('ressource_amount','integer','2'); 
    } 

    public function setUp() { 
     $this->hasOne('User as Owner',array(
       'local' => 'owner_id', 
       'foreign' => 'id' 
     )); 
    } 
} 

Et j'essayer de suivre DQL:

$sqlRessourceUpdate = Doctrine_Query::create() 
->update('Field f') 
->set('f.Owner.iron','f.Owner.iron + f.ressource_amount') 
->where('f.ressource_id = ?',1); 

Résultat:

'Doctrine_Query_Exception' with message 'Unknown component alias f.Owner' 

Basicly Je veux juste mettre à jour l'attribut "fer" du propriétaire du terrain selon la valeur des champs

Répondre

1

Je suppose que vous ne pouvez pas référencer d'autres tables comme ça dans votre requête.

Cela peut ne pas être la meilleure façon, mais voici ce que je fais

$q = Doctrine_Query::create() 
    ->select('*') 
    ->from('Field') 
    ->where('ressource_id = ?',1); //btw resource has one 's' 

$field = $q->fetchone(); 

$field->Owner['Iron'] += $field->ressource_amount; 
$field->save(); 

EDIT: En fait, je ne sais pas si cela fonctionnera ... ce qui est plus comme ce que je fais

$q = Doctrine_Query::create() 
    ->select('*') 
    ->from('Field') 
    ->where('ressource_id = ?',1); //btw resource has one 's' 

$field = $q->fetchone(); 

$user = $field->Owner; 
$user['Iron'] += $field->ressource_amount; // I have never used a += like this, but in theory it will work. 
$user->save(); 
+0

merci. Je fais quelque chose de similaire maintenant. Il est à noter que la méthode save() est très lente et déclenche BEAUCOUP de requêtes, selon vos modèles. Dans mon cas ci-dessus, il en résulte environ 100 requêtes par utilisateur. Si vous voulez des performances, enregistrez manuellement. merci pour la "s" correction btw. Toujours se tromper;) – SkaveRat