2009-07-21 4 views
1

Ich bin nicht in der Lage, referenzielle Integrität Beziehung mit Zend Frameworks Tabellenbeziehungen wie in der manual dokumentiert zu definieren.Hilfe Definieren referenzielle Integrität in Zend Framework 1.8.3 mit Data Mapper-Modell

Ich habe jede mögliche Konfiguration erschöpft (so scheint es), und jetzt bin ich mit der Aussicht konfrontiert, die Anwendung zu entwickeln, ohne kaskadierende Löschungen verwenden zu können, was unerwünscht ist.

Kann jemand sehen, was falsch ist oder irgendwelche Vorschläge anbieten?

Mein Projekt wird mit der neuen Methode ZF 1.8.3 mit Datamappern eingerichtet, und ich frage mich, ob dies ein Grund ist, warum ich das Verhalten nicht replizieren kann, wie im Referenzhandbuch beschrieben. Hat jemand Erfahrung mit diesem Problem?

Hier sind die relevanten Teile der Klassen:

application/models/UsersMapper.php

class Default_Model_UsersMapper { 
    public function deleteUser($id, Default_Model_Users $users){ 

    $usersTable = new Default_Model_DbTable_Users();   
    $usersRowset = $usersTable->find($id);  
    $userToDelete = $usersRowset->current();  
    $userToDelete->delete(); 

} 

application/models/DbTable/users.php

class Default_Model_DbTable_Users extends Zend_Db_Table_Abstract 
{ 
/** 
* @var string Name of the database table 
*/ 
protected $_name = 'users'; 

/** 
* @desc reference map 
* 
*/ 
protected $_referenceMap = array(
    'Comment' => array(
    'columns'  => array('user_id'), 
     'refTableClass' => 'Comment', 
     'refColumns' => array('id'), 
     'onDelete'  => self::CASCADE 
    ) 
); 

} 

application/models /CommentMapper.php

... und die zugehörige Tabelle definiert durch die Klasse:

comment.php

class Default_Model_DbTable_Comment extends Zend_Db_Table_Abstract 
{ 
/** 
* @var string Name of the database table 
*/ 
protected $_name = 'comment'; 

    /** 
* @desc Defining referential integrity here since we are using MyISAM 
* Dependent tables are referred via the class name. 
*/ 
protected $_dependentTables = array('Users'); 
} 
+0

Warum haben Sie einen ungenutzten zweiten Parameter Benutzer löschen()? Default_Model_Users $ users – hobodave

+0

Das ist irgendwie dumm ... Und was ist mit Klasse Autoload? –

Antwort

0

Ohhhh, ich sehe es jetzt. Ihre Klassen heißen Default_Model_DbTable_Xxx, Sie bezeichnen sie in Ihren Klassen jedoch als Xxx. Nehmen Sie die von tharkun vorgeschlagenen Änderungen vor und ändern Sie Ihre Klassennamen, um gültig zu sein:

z.

protected $_dependentTables = array('Comment'); 

und

'refTableClass' =>  'User', 

werden

protected $_dependentTables = array('Default_Model_DbTable_Comment'); 

und

'refTableClass' => 'Default_Model_DbTable_User' 
1

Vielen Dank für die Fehler in den Klassendefinitionen Spek.

Mein Problem, das Zend Framework für die Bereitstellung einer DRI-Schicht zu bekommen, wurde eingeschränkt und kann nun als solches zusammengefasst werden.

diese Klassendefinitionen verwenden: Ich kann den Benutzer löschen, aber nicht die damit verbundene Kommentar durch meine lokalen Usercontroller „public/users/löschen/userId/22“

class Default_Model_DbTable_Comment extends Zend_Db_Table_Abstract 
    { 
     /** 
     * @var string Name of the database table 
     */ 
     protected $_name = 'comment'; 

     /** 
     * @desc reference map 
     * 
     * Rows in the comment table are to be automatically deleted if the row in the 
    * User table to which they refer is deleted 
    *  
    */ 
    protected $_referenceMap = array(
     'User' => array(
      'columns'  => 'user_id', // the foreign key(s) 
      'refTableClass' => 'Default_Model_DbTable_Users', 
      'refColumns' => 'id', 
      'onDelete'  => self::CASCADE, 
     ) 
    ); 

} 
class Default_Model_DbTable_Users extends Zend_Db_Table_Abstract 
{ 
    /** 
    * @var string Name of the database table 
    */ 
    protected $_name = 'users'; 


    /** 
    * @desc Defining referential integrity here since we are using MyISAM 
    * Dependent tables are referred via the class name. 
    */ 
    protected $_dependentTables = 'Default_Model_DbTable_Comment'; 



} 
Verwandte Themen