我想知道,我如何通过名为findListBy(...)的 Magic Find Function 扩展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'));
和是:需要返回数组的结构。
答案 0 :(得分:0)
魔术findAllBy
方法已实现directly in the query method - 如果不覆盖正在使用的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)
要灵活得多。
答案 1 :(得分:-2)
是的,有,它的来电find()
:
http://book.cakephp.org/2.0/en/models/retrieving-your-data.html#find
我实际上从未见过使用那些魔术包装的必要性。既不是所有人也不是列表也不算数。
特别是因为它们在使用时提供了类型提示和方法参数提示或文档块信息的可能性。
提示:
使用模型层编写复杂查询,然后从外部访问这些包装器。 这样,当整个查询构建停留在模型中时,访问仍然很短。 你也保留你的输入等。
编辑:部分答案在评论中。修改后的内容更加清晰。