2014-06-18 106 views
0

我正在用CakePHP製作一個PHP論壇我很煩惱獲取所有成員的數組然後在視圖中回顯它們,下面是我的代碼。CakePHP模型「成員」與模型「成員」沒有關聯

<?php 
App::uses('AppModel', 'Model'); 

class Member extends AppModel { 

    public $validate = array(
     'username' => array(
      'notEmpty' => array(
       'rule' => array('notEmpty') 
      ), 
     ), 
     'password' => array(
      'notEmpty' => array(
       'rule' => array('notEmpty') 
      ), 
     ), 
     'email' => array(
      'email' => array(
       'rule' => array('email') 
      ), 
     ), 
    ); 

    public $hasMany = array(
     'Post' => array(
      'className' => 'Post', 
      'foreignKey' => 'user_id', 
      'dependent' => false, 
      'conditions' => '', 
      'fields' => '', 
      'order' => '', 
      'limit' => '', 
      'offset' => '', 
      'exclusive' => '', 
      'finderQuery' => '', 
      'counterQuery' => '' 
     ), 
     'Topic' => array(
      'className' => 'Topic', 
      'foreignKey' => 'user_id', 
      'dependent' => false, 
      'conditions' => '', 
      'fields' => '', 
      'order' => '', 
      'limit' => '', 
      'offset' => '', 
      'exclusive' => '', 
      'finderQuery' => '', 
      'counterQuery' => '' 
     ) 
    ); 
} 

這就是我在這裏的成員模型是我MembersController

<?php 
App::uses('Controller', 'AppController'); 

class MembersController extends AppController { 

    public $components = array('Paginator'); 

    public function beforeFilter() { 
     parent::beforeFilter(); 
     $this->Auth->allow('profile','login'); 
    } 

    public function index(){ 
     $this->Paginator->settings['contain'] = array('Member'); 
     $this->set('members', $this->Paginator->paginate()); 
    } 

    public function profile($id=null) {} 

    public function login() { 
     if($this->request->is('post')) { 
      if ($this->Auth->login()) { 
       $this->redirect($this->Auth->redirect()); 
      } else { 
       $this->Session->setFlash(__('Invalid username or password')); 
      } 
     } 
    } 

    public function logout() { 
     $this->redirect($this->Auth->logout()); 
    } 
} 

這裏是我的索引視圖

<div class="row"> 
    <?php foreach ($members as $member): ?> 
     <?php echo $user[name]; ?> 
    <?php endforeach; ?> 
</div> 

當我訪問example.com/members我得到一個錯誤說型號「成員」與模型「成員」沒有關聯[CORE/Cake/Model/Behavior/ContainableBehavior.php,line 342]

個你問之前,我已經取得AppModels ACTAS中可容納

class AppModel extends Model { 
    public $actsAs = array('Containable'); 
} 
+0

有了burzum的大量幫助,我已經修復了它,並且我還發現,不管你稱之爲控制器,只要添加公共$ uses = array(' Model1','Model2','Model3');在控制器的頂部 – user2710382

+0

而不是將許多模型加載到控制器中(即使它們被延遲加載),最好通過該控制器的主模型的關聯來訪問其他模型。 – burzum

回答

1

刪除該行:

$this->Paginator->settings['contain'] = array('Member'); 

你造成使用這種自聯接,你有沒有定義在你的成員模型中,你不需要那個。

這是錯誤的以及你的PHP有一個語法錯誤 - 缺少'名稱周圍。

<?php foreach ($members as $member): ?> 
     <?php echo $user[name]; ?> 
    <?php endforeach; ?> 

它應該是:

<?php foreach ($members as $member): ?> 
     <?php echo $member['Member']['name']; ?> 
    <?php endforeach; ?> 

你最基礎掙扎,我會建議你做blog tutorial或至少了解數據是如何傳遞給視圖,以及如何模型協會的工作。你可以在the book找到所有的東西。

+0

謝謝。我是新來的MVC和il檢查那些鏈接肯定。 – user2710382

0

你的問題是在這裏:

public function index(){ 
    $this->Paginator->settings['contain'] = array('Member'); 
    $this->set('members', $this->Paginator->paginate()); 
} 

由於PAGINATE正在從成員控制器被調用,默認情況下將嘗試進行分頁會員。您的包含設置指示成員數據還應包含關聯模型,也稱爲成員。成員和自己之間沒有關聯,因此錯誤。我會假設包含的設置是錯誤的,於是乾脆刪除行$this->Paginator->settings['contain'] = array('Member');

0

$this->Paginator->settings['contain'] = array('Member');是你的問題。由於該設置將作爲選項傳遞給find(),因此請求Member模型,您實際上會要求Member包含它自己。將'contain'設置爲array()以防止獲取任何關聯的記錄。

雖然推薦的方法是在AppModel中設置屬性$recursive-1,以便默認不會獲取關聯的記錄。 Containable然後用於根據需要提取相關記錄。