在CakePHP 3.5中的Where控制器或模型中放置Where查询条件

时间:2018-03-17 09:05:36

标签: cakephp conditional-statements query-builder cakephp-3.x cakephp-3.4

我是CakePHP 3.5的新手。请你好好回答我,因为我真的需要帮助来解决这个问题,或者至少提出一个如何解决这个问题的想法。我已经阅读了几乎相同的问题,但他们提供的大多数答案已经被弃用了。

我的问题是我想在索引中显示保留的交易。我在客户端事务控制器

中尝试此查询
public function index()
{
    $this->paginate = [
        'contain' => ['Clients']
    ];

    $clientTransaction = $this->paginate($this->ClientTransaction);
    $clientTransaction = $this->ClientTransaction->find()
    ->where(['status' => 0]);
    $this->set(compact('clientTransaction'));
}

This the screenshot of the error in index.ctp

我在控制器中对其进行编码是正确的,或者最好将该查询代码放在模型中?

2 个答案:

答案 0 :(得分:2)

paginate来电的结果将被find调用的结果丢弃并覆盖,因为您使用了相同的变量名称。在the manual中有一个将查询对象传递给paginator的示例。在你的情况下,它看起来像这样:

$clientTransaction = $this->ClientTransaction->find()
    ->where(['status' => 0]);
$clientTransaction = $this->paginate($clientTransaction);

答案 1 :(得分:1)

答案非常明确:模型。

本手册还会告诉您“胖型,瘦型控制器”。原因只是应用程序不同部分的separation of concerns。控制器不需要了解模型及其逻辑。

控制器只需要处理请求并使用它将其数据委托给实现实际业务逻辑的其他对象。这样可以更轻松地更改,测试和交换或共享应用程序的各个部分。

如果你想更进一步,做一个正确的SoC,它实际上是控制器,服务,模型/表。

例如,custom finders应该进入一个表,任何数据库(或模型实现的任何类型的存储库)都应该在模型中发生。

因此,在您的情况下,在您的模型中实现您需要的任何条件作为自定义查找器,然后在控制器中调用它:

$query = $this->MyTable->find('customFinder');
$this->set('results', $this->paginate($query));

如果您需要将args传递给查询,我通常会实现一个单独的方法(findIndex& getIndexQuery($ queryParams))来获取参数,例如URL查询参数并调用自定义查找并返回查询宾语。如果您使用服务层,此方法将进入您的服务层,因为它实现了业务逻辑。

服务类是一个自定义类,不是CakePHP框架的一部分,它将实现真正的业务逻辑并进行任何类型的计算或其他任何需要完成的逻辑操作,并将结果传递回控制器,然后将结果传递给视图。

这确保了代码的每个部分都易于测试和交换。例如,该服务在shell应用程序中也可用,因为它不依赖于控制器。