【问题标题】:Covert into Cakephp query with subquery使用子查询转换为 Cakephp 查询
【发布时间】:2011-07-16 07:19:15
【问题描述】:

有谁知道如何转换这个查询:

SELECT * from diminventory where partnumber='350964-B22' or partnumber in (SELECT partnumber from dimparts where parentpartnumber='350964-b22')

在 cakephp 查询中

谢谢

【问题讨论】:

  • 请用 \ 转义你的反引号。区别在于blah 与写为\`blah\`的`blah`

标签: cakephp subquery


【解决方案1】:

我还不能 100% 确定您要的是什么,但这里有一个关于 cakephp 查询的简短教程。

$this->ModelName->query("SELECT * FROM tablename LIMIT 2;");

您从模型中查询,但您使用文字表名。您使用 SQL“AS”关键字重命名结果数组的键。

示例结果:

Array
(
    [0] => Array
        (
            [tablename] => Array
                (
                    [id] => 1304
                    [user_id] => 759
                )
        )

    [1] => Array
        (
            [tablename] => Array
                (
                    [id] => 1305
                    [user_id] => 759
                )
        )
)

【讨论】:

    【解决方案2】:

    他要求的是 Cakephp 查询而不是自定义 SQL 查询。在控制器中:

    $partnumber = $this->diminventory->find('all',array('conditions' => array('diminventory.partnumber' => '350964-B22')));
    $this->set('partnumber',$partnumber);
    

    set 函数将变量作为 $partnumber 传递给视图。然后int view(即.ctp文件)需要输出数组。

    foreach($partnumber as $partnumbers){
    echo $partnumbers;
    }
    

    确保 diminventory 表在名称后有“s”,否则它将无法工作,因为这是 Cakephp 严格命名约定的一部分。

    查找功能教程: http://book.cakephp.org/view/1018/find

    【讨论】:

      【解决方案3】:

      要完全做到Cake'ish,你需要使用CakePHP subquery

      $dbo = $this->User->getDataSource();
      $subQuery = $dbo->buildStatement(
          array(
              'fields' => array('`Dimpart`.`partnumber`'),
              'table' => $dbo->fullTableName($this->Dimpart),
              'alias' => 'Dimpart',
              'conditions' => array('`Dimpart`.`parentpartnumber`' => '350964-b22'),
          ),
          $this->Dimpart
      );
      
      $subQuery = ' `DiminventoryEntry`.`partnumber` IN (' . $subQuery . ') ';
      $subQueryExpression = $dbo->expression($subQuery);
      
      $conditions[] = $subQueryExpression;
      $conditions['DiminventoryEntry.partnumber'] = '350964-B22';
      
      $result = $this->DiminventoryEntry->find('all', compact('conditions'));
      

      Dimpart 是你的表 dimparts 的模型,DiminventoryEntry 是你的表 diminventory 的模型(这实际上不是 Cake'ish,你应该根据 conventions 重命名你的表) .

      【讨论】:

        猜你喜欢
        • 2010-12-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-06-11
        • 2012-03-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多