【问题标题】:How to write complex JOIN query in CDbCriteria Yii Framework如何在 CDbCriteria Yii 框架中编写复杂的 JOIN 查询
【发布时间】:2013-08-29 02:57:42
【问题描述】:

我有两个表:product 和 document,它们都与 document_id 有关系。

现在我想使用 Yii CDbCriteria 从数据库中通过product_id 获取文档名称。

喜欢:

SELECT d.* 
FROM `document` As d, `product_document` AS p 
WHERE d.document_id=p.document_id
AND
p.product_id=133;

我想编写相同的查询,但使用CDbCriteria。我已经尝试过了,但我被它的语法卡住了。

【问题讨论】:

    标签: php sql yii


    【解决方案1】:

    这是您的标准,假设您的关系设置正确:

    $c = Document::model()->getDbCriteria();
    $c->with[] = 'product';
    $c->addCondition('product.product_id = :product_id');
    $c->params[':product_id'] = 133;
    

    【讨论】:

      【解决方案2】:

      Harry 有正确的语法。如果您想让它在整个应用中更简洁、更可重用,请考虑使用命名范围:

      /* scope in your Document model */
      public function forProductId($id) {
          $criteria = new CDbCriteria();
          $criteria->condition = 'product.id = :productId',
          $criteria->with = 'product';
          $criteria->params = array(
              ':productId' => (int)$id,
          );
          return $this->dbCriteria()->mergeWith($criteria);
      }
      

      随着时间的推移使您的设置更加可重复使用...

      【讨论】:

      • +1 是 parameterized named scope 的一个很好的用例。为了完整性:@Glenn,您应该将此方法放入您的 Document 模型中,然后可以像 $documents = Document::model()->forProductId($id)->findAll() 一样使用它。
      • @MichaelHärtl 谢谢。我正在做一个项目,我一直遇到这种类型的标准代码,我一直在努力鼓励我的同事做出转变,这是非常宝贵的 ;-)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-06-06
      相关资源
      最近更新 更多