如何在fuelPHP Orm模型中选择MAX或COUNT

Posted

技术标签:

【中文标题】如何在fuelPHP Orm模型中选择MAX或COUNT【英文标题】:How to select MAX or COUNT in fuelPHP Orm Model 【发布时间】:2014-02-27 15:17:29 【问题描述】:

这两种方法我都试过了,但都失败了... 在 Model Orm 中选择 MAX 或 COUNT 是不可能的吗? (我必须使用 Model_Orm,而不是 CRUD 或 DB)

1

Model_Foo::query()
    ->select('MAX("time") AS recent')
    ->group_by("user_id")
    ->get();

结果:

Fuel\Core\Database_Exception [ 42000 ]:
SQLSTATE[42000]: Syntax error or access violation: 
1064 You have an error in your SQL syntax; 
check the manual that corresponds to your mysql server version for the right syntax to use near '`) as recent` AS `t0_c0`

2

Model_Foo::query()
    ->select(DB::expr('MAX("time") AS recent'))
    ->group_by("user_id")
    ->get();

结果:

Fuel\Core\phpErrorException [ Warning ]:
Illegal offset type

【问题讨论】:

我不使用fuelPHP,但我的猜测是删除MAX(time)周围的引号 感谢 Daan,我已经尝试过无引号、单引号、双引号和反引号,但都失败了。 【参考方案1】:

这里的简单答案是您没有。在理想情况下,您不应使用模型属性的子集或“动态”创建新属性,因为它破坏了 ORM 提供的抽象。

最简单的做法是在模型中添加一个额外的方法,例如public static function getMaxTime(),它使用DB 类来构造查询以返回所需的数据。

为了使其与 ORM 的表名发现保持一致,您可以使用 Model::table() 从模型中获取表名并将其传递给您的 DB 查询。

$query = DB::select(/** Enter "MAX" here */)
    ->from(static::table())
    // More stuff here 

【讨论】:

谢谢乌鲁。我看到 ORM 有明确的目的。老实说这有点不舒服,我决定使用 DB 创建一个新方法。 当前的 ORM 并没有真正为这样的事情设置,v2 应该更容易做这样的事情。您可以在当前 ORM 中做的一件事是覆盖 Model 的 get() 方法,这样您就可以将对 DB 的调用屏蔽为属性,如果您想要这种抽象。【参考方案2】:

你考虑过 ->as_object 方法吗? 我注意到您没有指定 DB::methods,但由于循环将返回 Orm\Model, 我认为这可能是一个不错的解决方案。

$dataset = Db::select(DB::expr('MAX(time) AS recent, user_id'))
->from('table')
->group_by('user_id')
->as_object('Model_Foo')
->execute();

foreach($dataset as $m)  
    print ($m->get('recent').' '.$m->get('user_id'));

你可以使用max函数

$time_string = Model_Foo::query()->max('time');

它将直接返回值(不在数组或模型中)

来自fuelphp文档的参考: http://fuelphp.com/docs/packages/orm/crud.html

【讨论】:

谢谢。我知道 max 方法,但它从所有返回的行中返回一个“max”。我想要每个分组行中的“max”列。

以上是关于如何在fuelPHP Orm模型中选择MAX或COUNT的主要内容,如果未能解决你的问题,请参考以下文章

Fuelphp属于关系,不同的模型

FuelPHP ORM - 未找到属性

如何在 FuelPHP 中为关系查询添加条件?

FuelPHP的orm和mysql不区分大小写`like`

在fuelphp中查询数据库的更好方法是啥?

Fuel PHP - ORM - 有很多并且属于