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

时间:2014-02-27 15:17:29

标签: php orm fuelphp

我尝试了这两种方法却失败了......
在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

2 个答案:

答案 0 :(得分:1)

这里简单的答案是你没有。在理想的世界中,您不应该使用模型属性的子集,也不应“动态”创建新的属性,因为它会破坏ORM提供的抽象。

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

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

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

答案 1 :(得分:0)

您是否考虑过 - > as_object方法? 我注意到你没有指定DB ::方法,但由于循环将返回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'));
}

您可以使用最大功能

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

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

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