Crud/CakePHP:在控制器中放置findMethod

gg58donl  于 2023-06-23  发布在  PHP
关注(0)|答案(1)|浏览(118)

我指的是这个文档:https://crud.readthedocs.io/en/latest/actions/index.html#findmethod
有没有办法把find方法放在控制器中,而不是放在App\Model\Table中?

  • 我想达到的目标:*

我想在index操作中应用一个过滤器,这取决于某些条件。例如,这意味着Users的分页应该只显示名称以特定字母开头的用户,并且当页面刷新时将提供该字母,并且该字母将始终更改。
如果不可能,有没有一种方法可以在从数据库加载任何数据之前应用此过滤器?
我在UsersController.php中尝试了这段代码,但表总是显示所有行。我显然不明白这是怎么回事。

public function index()
{
    $users = $this->paginate($this->Users->find()->where(["id" => 1] ));
    $this->set(compact("users"));
    return $this->Crud->execute();
}

但是,当-为了测试-我在where条件中使用未知字段[例如bar]时,我会得到这个- correct - error消息:

Column not found: 1054 Unknown column 'bar' in 'where clause'

因此,显然,应用了where条件,但由于某些原因,返回了所有行,而不是只有一行带有id = 1。我错过了什么?

更新:

在查看了源代码之后,我看到字符串find被设置为finder方法名的前缀,所以任何其他范围都是不可能的。也许在更新中可以考虑这一点。
现在我有两种可能性:
1.将其添加到表文件中。
1.在Controller中设置一个过滤器,但我仍然没有弄清楚它是如何工作的。即使我在$event中设置了beforePagination,使用setData( "query", $this->Users->find()->where( ["id" => 1]),这也会被忽略。

mhd8tkvw

mhd8tkvw1#

问题#2的解决方案:

UsersController.phpindex()方法中添加以下内容:

$this->Crud->on('beforePaginate', function(\Cake\Event\EventInterface $event) {
   $this->paginate ['conditions']['id'] = <the-id>;
});

相关问题