cakephp , the subquery (2)

Cakephp 框架帮我们做了很多的工作,的确省了我们很多工作,提高了效率。

但是,碰到一些比较复杂的查询时,还是有些问题,官方的cookbook api 有说明一些详细的用法,但感觉还是不太够,有些地方讲的不够清楚。

StackOverflow上的这个问题不错

http://stackoverflow.com/questions/5770032/cakephp-and-subquery

The Question:

How can I write SQL subquery using cake syntax. I know how to code simple query, but I can‘t handle subquery.

This is the original query:

SELECT Assumption.id, Referee.id, Referee.first_name, Referee.second_name
FROM referees AS Referee
INNER JOIN (

    SELECT a.id, a.referee_id
    FROM assumptions a
    WHERE a.season_id =7
) AS Assumption ON Referee.id = Assumption.referee_id

The answer

Since you didn‘t understand the syntax, this is the actual query:

$records = $this->Referee->find(‘all‘, array(
                ‘fields‘ => array(
                    ‘Assumption.id‘, ‘Referee.id‘, ‘Referee.first_name‘, ‘Referee.second_name‘
                    ),
                ‘joins‘ => array(
                    array(
                        ‘table‘ => ‘assumptions‘,
                        ‘alias‘ => ‘Assumption‘,
                        ‘type‘  => ‘INNER‘,
                        ‘foreignKey‘    => false,
                        ‘conditions‘    => array(‘Referee.id = Assumption.referee_id‘, ‘Assumption.season_id = 7‘),
                        ),
                ),
            )
        );

  Which produces this query:

SELECT
    `Assumption`.`id`,
    `Referee`.`id`,
    `Referee`.`first_name`,
    `Referee`.`second_name`
FROM `referees` AS `Referee`
INNER JOIN assumptions AS `Assumption`
    ON (`Referee`.`id` = `Assumption`.`referee_id`
        AND `Assumption`.`season_id` = 7)

  

Which provide the results you are looking for.

Sample output:

Array
(
    [0] => Array
        (
            [Assumption] => Array
                (
                    [id] => 1
                    [0] => Array
                        (
                            [id] => 1
                            [season_id] => 7
                            [referee_id] => 1
                            [name] => SomeAssumpton
                        )

                )

            [Referee] => Array
                (
                    [id] => 1
                    [first_name] => Ref
                    [second_name] => one
                )

        )

)

  Another Answer

so after what seemed like years (several hours) and reading cake source... if you want to simply type your subquery into your cake conditions...

it uses php stdClass not an array entry... it will just dump your "value" into the query...

 $subquery = new stdClass();
    $subquery->type = "expression";
    $subquery->value = "Product.id IN (select product_id from product_categories where category_id=‘$category_id‘ or belongs_to=‘$category_id‘)";

    $options[‘conditions‘][] = $subquery;  <- dump the class into your conditions array!

  

do normal query $this->table->find(‘all‘, $options)

EXAMPLE: (normal cake with subquery quickfix)

//only from my vendor
    $options[‘conditions‘][‘collection_id‘] = $vendor_id;

    //inner join to CollectionProduct
    $options[‘joins‘][0] = array(
        "table" => "collection_products",
        "alias" => "CollectionProduct",
        "type"  => "INNER",
        "conditions" => array(
            "Product.id = CollectionProduct.product_id",
        ),
    );

    //show only from current category
    if ($category_id) {
        $subquery = new stdClass();
        $subquery->type = "expression";
        $subquery->value = "Product.id IN (select product_id from product_categories where category_id=‘$category_id‘ or belongs_to=‘$category_id‘)";
        $options[‘conditions‘][] = $subquery;
    } else {
        //get 18 random items... no category selected?
        $options[‘limit‘] = 18;
    }

    return $this->find(‘all‘, $options);

  

1  

That‘s what happens behind the scenes, but the proper way to do it would be to follow the instructions in the Cookbook. –  Brad Koch Oct 7 ‘11 at 19:31
1  

if you goto your link and go down to "Sub-queries" you will see a huge overhead to generate the one line of sql shown above and this is short and sweet. there are plenty of queries cake "can‘t" do. If your doing multi-nested subqueries imagine how horrible the cookbook would be. –  duante Oct 7 ‘11 at 21:39
1  

The only reason this method saves space is because the subquery was written explicitly. The OP specifically stated they wanted to use cake methodology. The shortest route if you don‘t care is to simply use $this->Model->query(). Agreed, the guide‘s method is long, but it doesn‘t help that the author of the example code didn‘t do the greatest job. –  Brad Koch Oct 7 ‘11 at 21:55
1  

Only difference if you use query() directly you need to write the whole query not just an exception for the sub query. I have updated the example with an example to show this. –  duante 

时间: 2024-11-03 21:58:30

cakephp , the subquery (2)的相关文章

cakephp , the subquery

Cakephp 框架帮我们做了很多的工作,的确省了我们很多工作,提高了效率. 但是,碰到一些比较复杂的查询时,还是有些问题,官方的cookbook api 有说明一些详细的用法,但感觉还是不太够,有些地方讲的不够清楚. StackOverflow上的这个问题不错 http://stackoverflow.com/questions/5770032/cakephp-and-subquery The Question: How can I write SQL subquery using cake

This version of MySQL doesn&#39;t yet support &#39;LIMIT &amp; IN/ALL/ANY/SOME subquery&#39; 错误解决

原因是内层select语句带有limit子句. 原: update stu_score_childen A  set  A.fScore='-1' where  A.fID in (select B.fID from stu_score_childen B limit 0,50 ) 更改后的 update stu_score_childen A  set  A.fScore='-1' where  A.fID in (select C.fID from (select B.fID from st

错误代码: 1242 Subquery returns more than 1 row

1. 错误描述 1 queries executed, 0 success, 1 errors, 0 warnings 查询:SELECT t.id, DATE_FORMAT( t.statisTime, '%Y-%m-%d %H:%i:%s' ) statisTime, (SELECT `id` FROM t_truck_info WHERE id = t.plateId... 错误代码: 1242 Subquery returns more than 1 row 执行耗时 : 0.009 s

MySQL子查询subquery

子查询(Subquery)是指出现在其他SQL语句内的SELECT子句. 例如: select * from t1 where col1=(select col2 from t2); 其中select * from t1,称为Outer Query/Outer Statement(外层查询) select col2 from t2,称为SubQuery(子查询) 子查询必须嵌套在查询内部,且必须始终出现在圆括号内 子查询可以包含多个关键字或条件, 如distinct group by order

cakephp 的事件系统(Getting to grips with CakePHP’s events system), 基于观察者模式

This article was written about CakePHP 2.x and has been untested with CakePHP 3.x CakePHP seems to get a slightly unfavourable reputation when compared to the likes of Symfony orZend Framework due to its lack of namespaces and not playing nicely with

Cakephp 创建无模型的Controller

控制器(Controller)如果没有特定的表/模型关联的话,哪怕建测试都会出错,但你可以加一行到控制器(Controller)里就好了public $uses=array(); 或者 public $uses=false; <?php class AaaController extends AppController{ public $uses=FALSE; //public $uses=array(); 也可以 public function index(){ echo '无模型的Contr

cakephp 基本的环境

这里是在 window下的环境搭建,我假设php,apache,mysql,的基本环境都ok,如果没有的话,偷个懒,用集成环境吧,我用的wampserver.1:去官网(http://cakephp.org/)down个cakephp 的包吧, 解压得到一个文件夹,目录结构如下:2:把这些文件夹,文件拷贝直接丢到wampserver 给我们提供的www文件夹下 3:我们去访问http://localhost:80/ 看一下,结果可能是如下的样子: 4:现在去改配置吧,找到apache 的http

cakephp简单示例

今天学了一下php,看到网上很多人推荐cakephp,就下载来试用了一下.以下是我记录的笔记,入门级的.如果我的理解和描述有不对的地方,请大家帮我指出来,谢谢! 1.下载并安装cakephp cakephp官网:http://cakephp.org/ 或者http://www.microsoft.com/web/webmatrix/下载webmatrix,在这里安装cakephp. 2.创建数据库phptest,数据表users 3.连接数据库,app/Config/database.php p

我对Laravel ThinkPHP Yii symfony2 CI cakephp 的看法

这是我的真心体会,在尝试使用Laravel.ThinkPHP.Yii.symfony2.CI.cakephp.Yii2 之后的真实想法(default7#zbphp.com). 1)ThinkPHP (版本3.1.3) 我一开始用到的是ThinkPHP 3.1.3,入门门槛就是网址与方法对应这一点.当初我接触ThinkPHP3.1.3的时候其实3.2版本刚出不久,3.2与3.1.x相比是部分重构,用上了最新的命名空间,考虑到购买的虚拟主机可能不支持命名空间(命名空间必须PHP 5.3.3+才支持