如何在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的主要内容,如果未能解决你的问题,请参考以下文章