CakePHP模型“Member”与模特“Member”无关

时间:2014-06-18 19:06:15

标签: php cakephp

我正在使用CakePHP创建一个PHP论坛我很难找到所有成员的数组,然后在视图中回显它们,这是我的代码。

<?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时,我收到一条错误消息,说模型“Member”与模型“Member”无关[CORE / Cake / Model / Behavior / ContainableBehavior.php,第342行]

在你问我之前我已经让AppModels actas Containable

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

3 个答案:

答案 0 :(得分:1)

删除该行:

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

您通过使用此功能导致自我加入,并且您尚未在您的成员模型中定义,并且您不希望这样。

这也是错误的,而且你的php有语法错误 - 缺少&#39;名字周围。

<?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找到所有内容。

答案 1 :(得分:0)

你的问题在这里:

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

由于从成员控制器调用paginate,默认情况下会尝试对Member进行paginate。您的包含设置表明成员数据还应包含关联的模型,也称为成员。您和成员之间没有关联,因此错误。我将假设包含设置是一个错误,所以只需删除行$this->Paginator->settings['contain'] = array('Member');

答案 2 :(得分:0)

$this->Paginator->settings['contain'] = array('Member');是你的问题。由于该设置将作为Member模型上的find()调用的选项传递,因此您实际上要求Member包含自身。将'contain'设置为array()以防止提取任何相关记录。

虽然建议在$recursive中将属性-1设置为AppModel,但默认情况下不会提取相关记录。然后使用Containable根据需要获取相关记录。