2009-02-03 13 views
1

Y a-t-il un moyen d'utiliser les relations Zend_Db pour définir les objets associés? Je cherche quelque chose comme code suivant:Utilisation des relations pour la définition dans Zend_Db_Table_Row

$contentModel = new Content();   
$categoryModel = new Category(); 

$category = $categoryModel->createRow(); 
$category->setName('Name Category 4'); 

$content = $contentModel->createRow(); 
$content->setTitle('Title 4'); 

$content->setCategory($category); 
$content->save(); 

cette petite bibliothèque offre: http://code.google.com/p/zend-framework-orm/

a quelqu'un d'expérience avec cela? N'y a-t-il pas un plan pour quelque chose de similaire en ZF? Ou y a-t-il quelque chose de mieux à utiliser? (Je ne suis pas wnat d'utiliser la doctrine ORM ou quelque chose d'extérieur)

grâce

Répondre

1

J'Override toujours Zend_Db_Table et Zend_Db_Table_Row et utiliser mes propres sous-classes. Dans ma classe db_table je:

protected $_rowClass = 'Db_Table_Row'; 

Dans mon Db_Table_Row je __get suivante() et __set():

public function __get($key) 
{ 
    $inflector = new Zend_Filter_Word_UnderscoreToCamelCase(); 

    $method = 'get' . $inflector->filter($key); 

    if(method_exists($this, $method)) { 
     return $this->{$method}(); 
    } 

    return parent::__get($key); 
} 

public function __set($key, $value) 
{ 
    $inflector = new Zend_Filter_Word_UnderscoreToCamelCase(); 

    $method = 'set' . $inflector->filter($key); 

    if(method_exists($this, $method)) 
     return $this->{$method}($value); 

    return parent::__set($key, $value); 
} 

bascially qui indique juste la classe de rechercher des méthodes appelées getFoo () et setFoo() ou autre. Vous pourriez alors créer vos propres champs aussi longtemps que vous écrivez votre propre logique derrière. Dans votre cas peut-être:

public function setCategory($value) 
{ 
    $this->category_id = $value->category_id; 
} 
+0

salut, merci pour la réponse, mais je n'ai pas besoin de setters seulement pour les valeurs, ou pour définir ses propres fonctions. $ content-> setCategory ($ category); $ content-> save(); cela permet de créer une nouvelle ligne dans la table associée et de lier celle-ci sur les clés étrangères associées –

+0

Un peu hors sujet, mais j'étudie dans 'Zend_Db'. Auriez-vous des liens vers des articles ou des projets qui remplacent le fichier Zend_db_Table_Row? – troelskn

3

J'ai conçu et implémenté le code de relations de table dans Zend Framework.

Une clé étrangère ($content->category dans votre exemple) contient la valeur de la clé primaire dans la ligne parente qu'elle désigne. Dans votre exemple, le $category ne contient pas encore de valeur de clé primaire car vous ne l'avez pas enregistré (en supposant qu'il utilise un pseudo-kyke auto-incrémenté). Vous ne pouvez pas enregistrer la ligne $content jusqu'à ce que vous remplissez la clé étrangère, donc l'intégrité référentielle est satisfaite:

$contentModel = new Content();     
$categoryModel = new Category(); 

$category = $categoryModel->createRow(); 
$category->setName('Name Category 4'); 

$content = $contentModel->createRow(); 
$content->setTitle('Title 4'); 

// saving populates the primary key field in the Row object 
$category->save(); 

$content->setCategory($category->category_id); 
$content->save(); 

Il ne servirait à rien de passer l'objet Row à setCategory() si elle ne possède pas la clé primaire peuplée . $content->save() échouera s'il n'a pas de valeur de clé primaire valide à référencer.

Étant donné que vous devez remplir ce champ de clé primaire dans tous les cas, il n'est pas si difficile d'accéder au champ lorsque vous appelez setCategory().

Questions connexes