在非对象上调用成员函数find() - cakePHP

时间:2015-12-15 02:41:56

标签: php cakephp cakephp-2.x

我是cakePHP的初学者。获得以下错误

  

错误:在非对象文件上调用成员函数find():   /var/www/html/cakephp/app/Model/Post.php
  行:11

关于错误有很多相关的帖子,但是我无法通过引用它来跟踪问题。

我的模特Post.php

<?php

class Post extends AppModel {
public $validate = array(
'title' => array('rule' => 'notBlank'),
'body' => array('rule' => 'notBlank'));
public $belongsTo = 'Category';
public function actual(){ 
return $this->Post->find('all', array('conditions' => array('Post.deleted' => 0)));
}
}
?>

我在Controller中的index()

public function index() 
{
    $actual = $this->Post->actual();
    $this->Post->recursive = 0;
    $this->paginate = array ('limit' => 5);
    $this->set('actuals', $this->paginate());
}

我正在尝试实现软删除逻辑。如果用户单击“删除”,则数据库中已删除列中的标志将更改为1以获取相应的数据。因此,通常我必须显示删除= 0的数据。

我能够通过在索引视图中添加if条件来实现它,但这很不方便,我想在Model本身过滤数据(如果可能的话) 任何帮助将不胜感激。谢谢

更新 在我的模型中,我改变了

return $this->Post->find

return $this->find

现在错误消失了,但它显示了所有数据,甚至是已删除的数据!

2 个答案:

答案 0 :(得分:1)

您的模型帖子是正确的,但它在控制器中不正确。

解决方案1 ​​[简单]:

  • 型号:不变。功能&#39;实际&#39;可用于其他目的,但在这种情况下不需要。

  • 控制器:

    public function index() 
    {
        $this->Post->recursive = 0;
        $this->paginate = array (
            'limit' => 5,
            'conditions' => array(
                array('Post.deleted' => 0)
            )
        );
        $this->set('actuals', $this->paginate());
    }
    

解决方案2:

  • 型号:

    <?php
    
    class Post extends AppModel {
        public $findMethods = array('actuals' => true);
    
        public $validate = array(
            'title' => array('rule' => 'notBlank'),
            'body' => array('rule' => 'notBlank'));
        public $belongsTo = 'Category';
        protected function _findActuals($state, $query, $results = array()){ 
            if ($state === 'before') {
                $query['conditions']['Post.deleted'] = false;
    
                return $query;
            }
    
            return $results;
        }
    }
    ?>
    
  • 控制器:

     public function index() 
     { 
          $this->Post->recursive = 0;
          $this->paginate = array ('limit' => 5, 'findType' => 'actuals');
          $this->set('actuals', $this->paginate());
     }
    

参考:Cakephp 2.x - Custom find types

答案 1 :(得分:0)

终于得到了输出

public function index() 
    {
        $this->Post->recursive = 0;
        $this->Paginator->settings = array('conditions' => array('Post.deleted' => 0),'limit' => 5);        
        $this->set('actuals', $this->Paginator->paginate());
    }

上述更改给了我一个正常的输出,但仍未能在模型中过滤数据。如果您认为这也方便,请告诉我,我想学习高效编码:)谢谢!