【问题标题】:Cakephp query to get last single field data from multi userCakephp查询从多用户获取最后一个单字段数据
【发布时间】:2016-01-12 19:03:57
【问题描述】:

我有一个名为Transaction 的表,其关系为User,事务有一个名为balance 的字段。

数据如下:

id  user_id  balance 
1   22       365
2   22       15
3   22       900
4   32       100
4   32       50 

我需要所有用户关联数据和User 的最后插入余额字段。例如这里id=3 是user_id=22 的最后插入数据。

在原始 SQL 中我尝试过这个:

select * from transactions where id in (select max(id) from transactions group by user_id)

如果我在这里添加一个内部连接,我知道我还可以检索用户数据。但是我如何在 CakePHP 中做到这一点?

【问题讨论】:

  • 只要写一个高效的SQL语句,使用Cakephp的query method即可。通过find 实现并不容易/视觉上令人愉悦/易于维护。 IMO:你最好使用 query 并编写好的 cmets。
  • 我知道查询方法,但我想以 cakephp 格式应用它。

标签: sql cakephp orm cakephp-2.x cakephp-2.6


【解决方案1】:

恕我直言,subqueries 在 CakePHP 2.x 中很难看。您也可以硬编码 SQL 语句并通过 query() 执行它,正如 cmets 中的 @AgRizzo 所建议的那样。

但是,在检索组中的最后一个(最大、最旧等)项目时,有一个更优雅的解决方案。

在这个SQL Fiddle 中,我应用了

中描述的技术

CakePHP 2.x 等价物是:

$this->Transaction->contains('User');

$options['fields'] = array("User.id", "User.name", "Transaction.balance");

$options['joins'] = array(
    array('table' => 'transactions',
        'alias' => 'Transaction2',
        'type' => 'LEFT',
        'conditions' => array(
            'Transaction2.user_id = Transaction2.user_id',
            'Transaction.id < Transaction2.id'
        )
    ),
);

$options['conditions'] = array("Transaction2.id IS NULL");

$transactions=$this->Transaction->find('all', $options);

【讨论】:

  • 你需要比较id列,而不是balance列。
  • @AgRizzo 你是对的,不知道我为什么搞混了。编辑了答案。谢谢!
  • 使用 query() 是否安全?
  • 它是安全的,只要您不向可能的 SQL 注入漏洞开放它。见this question。
猜你喜欢
  • 2015-12-01
  • 2023-01-27
  • 1970-01-01
  • 2022-10-04
  • 2016-07-05
  • 1970-01-01
  • 1970-01-01
  • 2018-05-02
  • 1970-01-01
相关资源
最近更新 更多