3

我有一个包含位置属性的用户表,并且想创建一个模型函数来检索附近的用户(在给定的半径内)。这是我的模型:

    类用户扩展 AppModel {
        公共函数 getNearbyUsers($id,$dist=10) {
            返回 $this->query(...);
        }
    }

这是我试图调用该函数的控制器:

    类用户控制器扩展 AppController {
        公共函数 getNearbyUsers($id) {
            ...
            $this->User->getNearbyUsers($id)
            ...
        }
    }

然而,这样做会导致:PHP Fatal error: Call to a member function getNearbyUsers() on a non-object

我究竟做错了什么?


编辑:没关系,它不再抱怨了。但它抛出了一个 SQL 错误,我的模型函数实际上从未被调用过。在进一步检查 mysql 查询日志后,我看到:

    查询 SHOW TABLES FROM `xxx`
    查询 getNearbyUsers
    退出


似乎 CakePHP 将 $this->User->getNearbyUsers 解释为文字查询。所以我的问题仍然存在:如何在 Cake 中为模型添加自定义函数?

4

3 回答 3

4

请参阅http://book.cakephp.org/2.0/en/models/additional-methods-and-properties.html

虽然 CakePHP 的模型函数应该可以让您到达您需要去的地方,但不要忘记模型类就是这样:允许您编写自己的方法或定义自己的属性的类。

任何处理数据保存和获取的操作都最好放在模型类中。这个概念通常被称为胖模型。

模型

class Example extends AppModel {
    function getRecent() {
        $conditions = array(
            'created BETWEEN (curdate() - interval 7 day) and (curdate() - interval 0 day)'
        );

        return $this->find('all', compact('conditions'));
    }
}

这个getRecent()方法现在可以在控制器中使用。

控制器

$recent = $this->Example->getRecent();
于 2012-07-07T04:12:33.827 回答
0

代码中需要添加一些附加项,否则您将收到非对象错误。

在应用模型中:

<?php

class Get extends AppModel {
    public function getRecent() {
        // $conditions = array(
            // 'created BETWEEN (curdate() - interval 7 day)' .
            // ' and (curdate() - interval 0 day))'
        // );
        // return $this->find('all', compact('conditions'));
    }
}

在应用程序控制器中,

?php



class GetsController extends AppController {

    public $uses = array('Get');  // Needed, or the error will appear.

    public function Example () {
       $this->Get->getRecent();
    }
}
于 2013-12-31T04:36:54.220 回答
0

Cake 1.3 有同样的问题,使用插件(模块),即使我们的模型名称在整个应用程序中是唯一的(一些模型名称用于多个插件中),它只有在我在控制器中请求模型时才起作用$uses带有它的插件的数组,如下所示:'Module1.A'

应用程序/插件/插件1/控制器/a_controller.php:

class AController extends AppController {

    // using simple array('A') worked fine for cake methods (find, query ...)
    // but did not recognized the custom method
    public $uses = array('Plugin1.A');

    public function Example () {
       $this->A->customMethod();
    }
}

应用程序/插件/plugin1/models/a.php:

<?php

class A extends AppModel {
    public function customMethod() {
        // ...
    }
}
于 2015-07-08T14:58:01.593 回答