【问题标题】:prepare my model to paginate results in cakephp准备我的模型以在 cakephp 中对结果进行分页
【发布时间】:2012-03-12 00:09:41
【问题描述】:

我发现在我的许多控制器方法中,我必须对结果进行分页,而方法之间只有一个或两个条件发生变化。我还需要有时不分页的选项。作为一个完整的编程新手,我想练习 DRY,所以在我在控制器中编码之前学习如何为可能的分页准备模型。我开始根据this Stack Overflow question 中的答案在我的模型中构建我的查询。不幸的是,提出这个问题的人没有包含他们代码的第一部分,所以我真的不知道他们模型查询的第一部分看起来如何。当我使用下面的代码时,模型上出现两个非法偏移类型错误。以下是我的模型代码:

<?php class Unit extends AppModel {
public $name='Unit';
public $actsAs = array('Containable');
public $belongsTo=array(
'User',
'Complex',

'Location',
);

public $hasOne=array(
    'Image'
    );
function getListings() {
    $paginate=array();
        $qOptions=array();
    $this->contain(array(
                    'User'=>array('id'),
                    'Location',
                    'Complex',
                    'Image'
                    )
            );
    if($paginate) {
        return $qOptions;
        }
    else {

        $data= $this->find('all', $qOptions);
        return $data;
    }
}
}
?>

这是我的控制器方法:

<?php
class LodgingsController extends AppController {
    public $name='Lodgings';

    public $layout='pagelayout';
    public $uses=array('User', 'Unit', 'Location');
    public $helpers=array('Text','Html','Js','GoogleMapV3');

    public $paginate=array();


public function debug() {

   $qOptions=array('conditions'=>array('Unit.active'=>1, 'Unit.type'=>'condo'), 'limit'=>9, 'order'=>array('Unit.id'=>'asc'));
   $opts['paginate'] = true;
   $paginateOptions=$this->Unit->getListings($opts);
   $this->paginate=$paginateOptions;
   $stuff=$this->paginate('Unit');
   $this->set('units', $stuff);



}

}
?>

【问题讨论】:

    标签: cakephp-2.0 cakephp-model


    【解决方案1】:

    我个人认为您尝试执行此操作的方式有很多开销。该模型非常简单,可以从控制器调用分页。我的第一选择是将它保存在控制器中。如果逻辑更复杂,我会说移动它。但你正在做的是直截了当的。这是我在控制器中的操作方式。

    <?php
    
    function yourFunction() {
        $this->Model->recursive = -1;
        if ($paginate == 'true') {
            $this->set('models', $this->paginate(set_options_here));
        } else {
            $this->set('models', $this->Model->find('all', array(set_options_here));
        }
    }
    ?>
    

    【讨论】:

    • 谢谢。我认为按照我的方式做会更简单,但我相信你的建议,从你的 Stack Overflow 点来看!实际上,从每个控制器方法执行此操作我不需要执行 if 语句,因为我知道我将或不会在每个方法中分页。所以我想我会像以前一样继续使用我的控制器方法。你能向我解释一下为什么我试图做的事情有很多开销吗?
    • 当您尝试对每个函数执行不止一件事时,代码会变得复杂。您的模型函数试图根据您传递的信息做两件事。如果你想这样做,你真的应该把它们分成两个函数。例如,您可以将它们命名为 getAllListingsgetPaginatedListings。很清楚每个函数的作用以及仅基于名称返回的数据。但是在我看来,让一个函数可能做多件事只会使代码变得不必要地复杂......保持简单和干净是我的座右铭。
    • 之前有人建议我保留“胖模型/瘦控制器”,这与我一直在做的相反,主要是因为 Cake 手册在控制器中做了所有事情,而且因为我在传递时很不稳定参数正确,我似乎从来没有正确地用词我的功能。谢谢你的洞察力。我希望在SO上遇到更多像你这样的导师类型!
    • 胖模型和瘦控制器绝对是要走的路。但正如您所见,控制器中的代码不能再精简了。 ;) 在将调用另一个单一方法的模型中调用单一方法没有多大意义。胖模型和瘦控制器背后的想法是当控制器开始在模型方面做太多事情时。但是你永远不会在控制器中调用模型。因此,如果它们是通用的查找/分页方法,只需从控制器调用它们。我总是乐于在力所能及的地方提供帮助。编码愉快!
    猜你喜欢
    • 2023-03-10
    • 2015-04-05
    • 2012-12-01
    • 2014-01-25
    • 2011-03-24
    • 2014-07-21
    • 1970-01-01
    • 2019-09-07
    • 2021-07-19
    相关资源
    最近更新 更多