2010-11-18 34 views
0

J'ai un modèle de rapport que j'utilise comme conteneur principal pour toutes les fonctions qui vont chercher diverses données de rapport. Ce modèle de rapport a les fonctions suivantesZend Framework comment puis-je accéder à différentes classes de tables depuis Application_Model_Report?

protected $_dbTable; 

public function setDbTable($dbTable) 
{ 
    if (is_string($dbTable)) 
    { 
     $dbTable = new $dbTable(); 
    } 

    if (!$dbTable instanceof Zend_Db_Table_Abstract) 
    { 
     throw new Exception('Invalid table data gateway provided'); 
    } 
    $this->_dbTable = $dbTable; 
    return $this; 
} 

public function getDbTable($dbTable) 
{ 
    if (null === $this->_dbTable) 
    { 
     $this->setDbTable($dbTable); 
    } 
    return $this->_dbTable; 
} 

public function agentDailyCollections() 
{ 
    //$db = 
    $sql = $this->getDbTable('Application_Model_DbTable_Groupsloandetails'`enter code here`)->select() 
       ->setIntegrityCheck(false) 
       ->from(array('gl' => 'groups_loan_details'), array()) 
       ->join(array('ml' => 'members_loan_details'), 'gl.id = ml.groups_loan_details_id', 
         array('SUM(ml.daily_payment) AS GroupDailyPayment')) 
       ->join(array('m' => 'members'), 'ml.members_id = m.id', array('id AS ID', 'first_name AS MFirstName', 'surname AS MSurname')) 
       ->join(array('g' => 'groups'), 'gl.groups_id = g.id', array('group_name')) 
       ->join(array('u' => 'users'), 'gl.loan_officer = u.id', array('id AS OID', 'first_name', 'surname')) 
       ->where('gl.loan_end >=?', date(Y.'-'.m.'-'.d)) 
       ->where('gl.occur = ?', 'Active') 
       ->group('(u.id)') 
       ->group('(g.group_name)') 
       ->group('(m.id) WITH ROLLUP'); 

    return $this->getDbTable()->fetchAll($sql); 
} 

public function groupsWithMembers() 
{ 
    $sql = $this->getDbTable('Application_Model_DbTable_Members')->select() 
       ->setIntegrityCheck(false) 
       ->from(array('m' => 'members'), array()) 
       ->join(array('g' => 'groups'), 'm.groups_id = g.id') 
       ->group('(g.group_area_residence)') 
       ->group('(g.group_name) WITH ROLLUP'); 

    return $this->getDbTable()->fetchAll($sql); 
} 

Dans ma tentative d'avoir accès à des tables différentes selon les différentes exigences de rapport, je passe le nom de la classe de table nécessaire à la fonction getDbTable attendant pour obtenir un objet de la table pour moi. Il fonctionne un peu mais je reçois le message d'erreur suivant

Warning: Missing argument 1 for Application_Model_Report::getDbTable(), called in D:\www\gepm\application\models\Report.php on line 131 and defined in D:\www\gepm\application\models\Report.php on line 22`enter code here` 

Je sais qu'il ya quelque chose de fondamentalement mal avec ce que je fais, mais pas sûr de ce que. Besoin d'aide les gars essayant juste d'obtenir la tête autour de cette chose d'objet/zend framework. Merci.

+0

Quelles sont les lignes 131 et 22? Je suppose que le 'est votre agentDailyCollections() cause des problèmes ici? – Fge

Répondre

0

Je pense que vous avez manqué la valeur par défaut pour l'argument de votre fonction, essayez de changer:

public function getDbTable($dbTable) 
{ 

avec

public function getDbTable($dbTable = null) 
{ 
+0

merci alifty pour la réponse. ça a fait l'affaire. Cependant, je voudrais savoir pourquoi je devais toujours définir une valeur par défaut même si je vais toujours passer un argument et dans ce cas je l'ai fait – Napoleon

+0

Je vois que vous ne passez pas toujours un argument à la fonction, voir 'return $ this- > getDbTable() -> fetchAll ($ sql); Vous avez appelé 'getDbTable()' sans passer d'argument;) – subosito

+0

alifity bien repéré – Napoleon