Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/57.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何在Kohana';s查询生成器?_Php_Mysql_Kohana 3 - Fatal编程技术网

Php 如何在Kohana';s查询生成器?

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

我正在尝试使用构建联合查询。在我添加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.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']);