Php 如何在Kohana';s查询生成器?
我正在尝试使用构建联合查询。在我添加GROUPBY或ORDERBY子句之前,一切正常 以下是我正在使用的代码(简化): 它不是在整个查询结束时添加GROUP BY和ORDER BY,而是在第二个查询之后立即添加它 这是它生成的SQL:Php 如何在Kohana';s查询生成器?,php,mysql,kohana-3,Php,Mysql,Kohana 3,我正在尝试使用构建联合查询。在我添加GROUPBY或ORDERBY子句之前,一切正常 以下是我正在使用的代码(简化): 它不是在整个查询结束时添加GROUP BY和ORDER BY,而是在第二个查询之后立即添加它 这是它生成的SQL: SELECT sh.name FROM stakeholder AS sh WHERE sh.organization LIKE 'foo%' GROUP BY name ORDER BY name LIMIT 10 UNION SELECT p.nam
SELECT sh.name FROM stakeholder AS sh WHERE sh.organization LIKE 'foo%'
GROUP BY name ORDER BY name LIMIT 10
UNION
SELECT p.name from person AS p WHERE p.organization LIKE 'foo%' LIMIT 10;
我想要的是:
SELECT sh.name FROM stakeholder AS sh WHERE sh.organization LIKE 'foo%'
UNION
SELECT p.name from person AS p WHERE p.organization LIKE 'foo%'
GROUP BY name ORDER BY name LIMIT 10;
这里的子句是从
union()
方法中设置的第一个查询中应用的,因此只需颠倒放置它们的位置:
$query1 = DB::select('p.name')
->from(array('person', 'p'))
->where('p.organization', 'LIKE', 'foo%')
->group_by('name')
->order_by('name')
->limit(10);
$names = DB::select('sh.name')
->union($query1, FALSE)
->from(array('stakeholder', 'sh'))
->where('sh.organization', 'LIKE', 'foo%')
->execute()
->as_array();
您还可以从
$names
中删除多余的->限制(10)
,因为它将被忽略,并被$query1
中的限制所取代,因为2011年的答案在Kohana 3.3中不起作用
但是我发现了这个模块:您还可以使用ORM的db_pending扩展Kohana_ORM:
class ORM extends Kohana_ORM {
public function union($table, $all = TRUE)
{
// Add pending database call which is executed after query type is determined
$this->_db_pending[] = array(
'name' => 'union',
'args' => array($table, $all),
);
return $this;
}
}
用法:
ORM::factory('MyModel')
->union(DB::select(DB::expr("'RP' id, 'Pasantías' name, 'Pasantías' short_name, 'R' parent_id, null data")))
->union(DB::select(DB::expr("'RC' id, 'Capacitación' name, 'Capacitación' short_name, 'R' parent_id, null data")))
->join(['catalogo', 'p'])->on('catalogo.parent_id', '=', 'p.id')
->where('p.parent_id', 'is', NULL)
->where('catalogo.id', 'not in', ['RV', 'RPA', 'RPT']);
你能告诉我们它生成的SQL,以及你期望的SQL吗?这很奇怪。我很确定我在3.3中做过类似的联合查询……但可能是错的。
ORM::factory('MyModel')
->union(DB::select(DB::expr("'RP' id, 'Pasantías' name, 'Pasantías' short_name, 'R' parent_id, null data")))
->union(DB::select(DB::expr("'RC' id, 'Capacitación' name, 'Capacitación' short_name, 'R' parent_id, null data")))
->join(['catalogo', 'p'])->on('catalogo.parent_id', '=', 'p.id')
->where('p.parent_id', 'is', NULL)
->where('catalogo.id', 'not in', ['RV', 'RPA', 'RPT']);