2014-06-18 153 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然后用于根据需要提取相关记录。