0

重複の可能性:
非オブジェクトでのメンバー関数の呼び出し

CakePHP アプリケーションのビューからモデルで補助関数 "getColition($id)" を呼び出そうとすると、次のエラーが発生します。

Fatal error: Call to a member function getCoalition() on a non-object
in C:\xampp\htdocs\MyCakeApp\app\View\Candidates\index.ctp on line 32

これは一般的な MVC に関連している可能性があると思いますが、わかりません。アプリは小さな「選挙」アプリです。同様の問題は、一般的な支援機能でも発生します。

モデルで関数を呼び出せないのはなぜですか? モデルは機能を補助する適切な場所ですか?

/app/Model/Candidate.php

<?php
/**
 * @property
 */
class Candidate extends AppModel {
    var $name = 'Candidates';

// THIS I WANT TO CALL
    public function getCoalition($id){
        $results = $this->Candidate->query("SELECT coalitions.name from candidates, coalitions where candidates.coalition_id = coalitions.id and candidates.id =$id");
        return $results;
    }
}
?>

/app/Controller/CandidatesController.php

<?php
class CandidatesController extends AppController {

    public $helpers = array('Html', 'Form');
    public $components = array('Session');
    var $name = 'Candidates';

    public function index() { //index stuff... }
    public function add()  { //add stuff...}
    public function edit($id = null)  { //edit stuff...}
    public function delete($id)  { //delete stuff...}
}
?>

/app/View/Candidate/index.ctp

<h1>Candidates</h1>
<p><?php echo $this->Html->link("Add candidate", array('action' =>'add'), array('class' => 'btn btn-primary')); ?></p>
<hr>
<table>
    <tr>
        <th>Name</th>
        <th>Coalition</th>
    </tr>
<?php foreach ($candidates as $candidate): ?>
    <tr>
        <td><?php echo $candidate['Candidate']['name']; ?></td>
        <td>
            <?php 
///////////////// THIS CREATES THE ERROR ///////////////// 
            echo $this->Candidate->getCoalition($candidate['Candidate']['coalition_id']);
            ?>
        </td>
        <td><?php 
        echo $candidate['Candidate']['votes'];
        echo $this->Html->link('Muokkaa', array('action' => 'edit', $candidate['Candidate']['id'])); 
         ?>    
    </td>
    </tr>
<?php endforeach; ?>
</table>
4

2 に答える 2

4

ビューでモデルを使用することはできません。あなたがする必要があるのは、コントローラーからビュー変数を設定することです。

あなたがしていることを詳しく見てみると、再帰レベルを上げるだけで、候補レコードで Colition データを返すか、Containable を使用できます。

$this->Candidate->find('all', array('conditions' => ..., 'recursive' => 2));

また

add public $actsAs = array('Containable'); AppModel と

$this->Candidate->find('all', array('conditions' => ..., 'contain' => array('Colition'));

Candidate と Colition の関係は?

于 2012-05-30T03:09:37.347 に答える
0

テーブル/フィールドです

候補者、連合からのcoalitions.name

データベースに存在しますか?

于 2012-05-30T04:33:07.550 に答える