2

我想知道,我如何通过一个名为 findListBy(...) 的Magic Find 函数扩展 CakePHP,其功能与 findAllBy(...) 相同,但返回一个列表

我正在寻找一个 findAllBy 等效项,但返回一个 find('list', ...) 而不是 find('all', ...)。

如果没有这样的功能,我怎么能自己实现这样的功能?我真的不知道,Magic Find Types是如何工作的 :(

提前致谢

编辑请比较命令的长度。两个命令都应该返回相同的数组:

// The common find('list', ...)
$post = $this->User->find('list', array(
    'conditions' => array('user_id' => $this->Auth->user('id')),
    'fields' => array('Post.user_id', 'Post.id')
));

// findListByUserId(...)
$post = $this->User->findListByUserId($this->Auth->user('id'), array('Post.user_id, 'Post.id'));

并且 YES:返回数组的结构是需要的。

4

2 回答 2

0

映射方法

魔术findAllBy方法直接在查询方法中实现——不可能在不覆盖正在使用的 dbo 类的情况下添加新的排列。

但是,方法名称不需要一对一地映射到一个真实的方法——定义自己的动态模型函数的方法是创建一个行为并定义mappedMethods。适应的问题是:

class MyBehavior extends ModelBehavior {

    public $mapMethods = array('/^findListBy/' => 'doSomething');

    public function doSomething(Model $model, $method, $arg1, $arg2) {
        // copy method name logic from DboSource::query
        
        return $Model->find('list', $params);
    }
}

不过,不得不说,使用动态方法名远不如构建 params 数组并仅调用find('list', $params).

于 2013-07-30T14:02:20.023 回答
-2

是的,有,它的调用find()http ://book.cakephp.org/2.0/en/models/retrieving-your-data.html#find

实际上,我从来没有看到需要使用那些神奇的包装器。既不为所有人,也不列出或计数。

特别是因为它们在使用它们时为类型提示和方法参数提示或文档块信息提供了 0 可能性。

小费:

使用模型层编写复杂的查询,然后从外部访问这些包装器。这样,当整个查询构建留在模型中时,访问仍然很短。您还可以保留您的打字提示等。

编辑:部分答案在评论中。进行了修改,以更清楚地说明完整的答案。

于 2013-07-30T13:03:59.943 回答