Php Zend findParentRow:无法识别的方法

Php Zend findParentRow:无法识别的方法,php,zend-framework,Php,Zend Framework,我是开发和Zend框架的新手。这个问题让我发疯了,我不知道为什么它不起作用 我的应用程序是一个手机管理软件。 我有两门课:“Fabriquant”和“Modele”。举个例子,我有一台移动设备,Fabriquant:Apple和Modele:iPhone4S 我想显示数据库中记录的所有移动设备的列表。我必须在视图中找到每个“模型”的“Fabriquant”数据 这是我的密码: index.phtml <table> <tr> <th&

我是开发和Zend框架的新手。这个问题让我发疯了,我不知道为什么它不起作用

我的应用程序是一个手机管理软件。 我有两门课:“Fabriquant”和“Modele”。举个例子,我有一台移动设备,Fabriquant:Apple和Modele:iPhone4S

我想显示数据库中记录的所有移动设备的列表。我必须在视图中找到每个“模型”的“Fabriquant”数据

这是我的密码:

    index.phtml
    <table>
    <tr>
    <th>Fabriquant</th>
    <th>Modèle</th>
    <th>&nbsp;</th>
    </tr>
    <?php 
    foreach($this->modele as $modele) : ?>
    <tr>
    <td><?php echo $this->escape($modele->getFabriquant()->FAB_NOM); // $modele->FAB_ID affiche bien l'ID du fabriquant></td>
    <td><?php echo $this->escape($modele->MOD_NOM);?></td>
    <td>
    <a href="<?php echo $this->url(array('controller'=>'modele',
    'action'=>'modifier', 'id'=>$modele->MOD_ID));?>">Modifier</a>
    <a href="<?php echo $this->url(array('controller'=>'modele',
    'action'=>'supprimer', 'id'=>$modele->MOD_ID));?>">Supprimer</a>
    </td>
    </tr>
<?php endforeach; ?>
</table>
这是我的Modele.php: 类应用程序\u Model\u DbTable\u Modele扩展了Zend\u Db\u Table\u抽象 {

这是我的ModeleRow.php: 类ModeleRow扩展了Zend\u Db\u Table\u Row\u Abstract{

public function getFabriquant(){
    $fabriquant = $this->findParentRow('fabriquant');
}
}

我有此错误消息和以下堆栈:

Message: Unrecognized method 'getFabriquant()' 

Stack trace:

#0 D:\PHP Workspace\mona\application\views\scripts\modele\index.phtml(21): Zend_Db_Table_Row_Abstract->__call('getFabriquant', Array)
#1 D:\PHP Workspace\mona\application\views\scripts\modele\index.phtml(21): Zend_Db_Table_Row->getFabriquant()
#2 C:\wamp\www\ZendFramework-1.11.11\library\Zend\View.php(108): include('D:\PHP Workspac...')
#3 C:\wamp\www\ZendFramework-1.11.11\library\Zend\View\Abstract.php(888): Zend_View->_run('D:/PHP Workspac...')
#4 C:\wamp\www\ZendFramework-1.11.11\library\Zend\Controller\Action\Helper\ViewRenderer.php(900): Zend_View_Abstract->render('modele/index.ph...')
#5 C:\wamp\www\ZendFramework-1.11.11\library\Zend\Controller\Action\Helper\ViewRenderer.php(921): Zend_Controller_Action_Helper_ViewRenderer->renderScript('modele/index.ph...', NULL)
#6 C:\wamp\www\ZendFramework-1.11.11\library\Zend\Controller\Action\Helper\ViewRenderer.php(960): Zend_Controller_Action_Helper_ViewRenderer->render()
#7 C:\wamp\www\ZendFramework-1.11.11\library\Zend\Controller\Action\HelperBroker.php(277): Zend_Controller_Action_Helper_ViewRenderer->postDispatch()
#8 C:\wamp\www\ZendFramework-1.11.11\library\Zend\Controller\Action.php(527): Zend_Controller_Action_HelperBroker->notifyPostDispatch()
#9 C:\wamp\www\ZendFramework-1.11.11\library\Zend\Controller\Dispatcher\Standard.php(295): Zend_Controller_Action->dispatch('indexAction')
#10 C:\wamp\www\ZendFramework-1.11.11\library\Zend\Controller\Front.php(954): Zend_Controller_Dispatcher_Standard->dispatch(Object(Zend_Controller_Request_Http), Object(Zend_Controller_Response_Http))
#11 C:\wamp\www\ZendFramework-1.11.11\library\Zend\Application\Bootstrap\Bootstrap.php(97): Zend_Controller_Front->dispatch()
#12 C:\wamp\www\ZendFramework-1.11.11\library\Zend\Application.php(366): Zend_Application_Bootstrap_Bootstrap->run()
#13 D:\PHP Workspace\mona\public\index.php(98): Zend_Application->run()
#14 {main}  
我想这将是一个新手问题,但我已经讨论了两天,我没有发现问题…非常感谢你的帮助

编辑: 这是我的ModeleController.php(对不起,这里有我所有的个人评论…) 类ModeleController扩展Zend\u控制器\u操作 {

}敬礼

在Frabicant类中,您可能需要说明我认为哪些是依赖表

 protected $_dependentTables = array('Application_Model_DbTable_Modele');
在模型类中,ref映射是错误的,我认为:

protected $_referenceMap = array(   // La table fabriquant dépendante
    'fabriquant' => array(
                    'columns'       =>  array('FAB_ID'),    
                    'refTableClass' =>  'Application_Model_DbTable_Fabriquant',  
    )
);
和列应该是一个数组

ps:我建议您在RDBMS中以复数形式命名您的表,但以单数形式命名您的模型。当您有时间时,您可以检查Zend/Doctrine集成

编辑

我敢肯定这句话是错的:

受保护的$_rowClass='ModeleRow'


您必须写入类的完整名称,而不仅仅是文件名。

请将代码发布到获取模型的位置好吗?例如,
$table=new MyTable();$row=$table->fetchRow($table->where('id=?',1));
这些更改没有解决问题,getFabriquant()方法仍然不被认可…对于表的复数形式,我的MERISE老师告诉我们用单数形式写它们…这就是为什么…但我想它可以起作用,对吗?我知道MERISE,但当你必须找到一个工作时,你会使用实体/关系或UML来建模你的数据库。谢谢你的评论,Camus。我写道这是因为我从本教程中改编了它:。在本教程中,我们有:
public function init()
{
    /* Initialize action controller here */
}

public function indexAction()
{
    Zend_Loader::loadClass("Modele", APPLICATION_PATH . "/models"); // indique l'emplacement du modèle
    //require_once 'FabriquantController.php';
    $this->view->title = "Liste des modèles"; // le titre affiché
    // Traitement du controleur
    $modele = new Modele();
    //.....traitement...

    // Transmet à la vue
    $this->view->modele = $modele->fetchAll();
        }

public function ajouterAction()
{
    $this->view->title = "Ajouter un nouveau modèle";
    $form = new Application_Form_Modele();                  // Création du formulaire
    //var_dump($form);
    $form->envoyer->setLabel('Ajouter');                        // Ajout d'un libellé au bouton d'envoi
    $this->view->form = $form;      

    if ($this->getRequest()->isPost()) {
        $formData = $this->getRequest()->getPost();
        if ($form->isValid($formData)) {
            $fabAccessData  = new Application_Model_DbTable_Fabriquant();
            $idFab          = $form->getValue('FAB_NOM');
            $nomModele      = $form->getValue('MOD_NOM');
            $accessData     = new Application_Model_DbTable_Modele();

            $accessData->ajouterModele($idFab, $nomModele);

            $this->_helper->redirector('index');
        } else {
            $form->populate($formData);
        }
    }
}

public function lireAction()
{
    // action body
}

public function supprimerAction()
{
if ($this->getRequest()->isPost()) {
        $del = $this->getRequest()->getPost('del');
        if ($del == 'Oui') {
            $id = $this->getRequest()->getPost('id');
            $modele = new Application_Model_DbTable_Modele();
            $modele->supprimerModele($id);
        }
        $this->_helper->redirector('index');
    } else {
        $id = $this->_getParam('id', 0);
        $modele = new Application_Model_DbTable_Modele();
        $this->view->modele = $modele->getModele($id);
    }
}

public function modifierAction()
{
$this->view->title = "Modifier un modèle";
    $form = new Application_Form_Modele();                  // Création du formulaire
    $form->setAction($this->view->url(array('controller' => 'modele', 'action' => 'modifier'), 'default', true));
    $form->envoyer->setLabel('Modifier');                       // Ajout d'un libellé au bouton d'envoi
    $this->view->form = $form;                                  // Envoi du formulaire à la vue

    if ($this->getRequest()->isPost()) {                        // si la méthode isPost de l'objet Request renvoi True, le formulaire à été envoyé
        $formData = $this->getRequest()->getPost();             // Récupération des données avec la méthode getPost()
        if ($form->isValid($formData)) {                        // Vérification de ces données avec la méthode isValid()


            $id = (int)$form->getValue('MOD_ID');               // Récupération de l'ID du fabriquant
            $nomFabriquant = $form->getValue('FAB_NOM');
            $fabriquant = new Application_Model_DbTable_Fabriquant();
            $idFabriquant = $fabriquant->getIdFabricant($nomFabriquant);
            $nomModele = $form->getValue('MOD_NOM');            // On récupère le nom du fabriquant
            $modele = new Application_Model_DbTable_Modele();   // On créé un nouvel enregistrement
            $modele->modifierModele($id, $idFabriquant, $nomModele);    // On affecte à cet enregistrement le nom du fabriquant, et on persiste en BDD
            $this->_helper->redirector('index');                // pour finir, on redirige vers index de Fabriquant
        } else {
            $form->populate($formData);                         // Si la validation n'est pas passée, on réaffiche les données dans le formulaire
        }
    }
    else {
            $id = $this->_getParam('id', 0);
            //var_dump($id);
            if ($id > 0) {

                $modele = new Application_Model_DbTable_Modele();
                $fabriquant = new Application_Model_DbTable_Fabriquant();
                $Fabriquant = $fabriquant->getFabriquant($id);
                $nomFabriquant = $Fabriquant['FAB_NOM'];
                //var_dump($nomFabriquant);
                $nomModele = $modele->getModele($id);
                echo "L'ID du modèle est : " . $id;     // Vérification
                //echo "L'ID du fabriquant est : " . $nomFabriquant['FAB_NOM'];     // Vérification
                $form->populate($nomModele, $nomFabriquant);
                //$form->populate($nomFabriquant);
            } else {
                echo "Information : nous sommes dans le else de modifierAction de FabriquantController.php";
                echo "L'ID est : " . $id;
            }
        }
}
 protected $_dependentTables = array('Application_Model_DbTable_Modele');
protected $_referenceMap = array(   // La table fabriquant dépendante
    'fabriquant' => array(
                    'columns'       =>  array('FAB_ID'),    
                    'refTableClass' =>  'Application_Model_DbTable_Fabriquant',  
    )
);