【问题标题】:cakephp find with contain belongsTo conditioncakephp找到包含belongsTo条件
【发布时间】:2013-12-21 06:33:50
【问题描述】:

情况如下:

购物车属于产品。一个产品属于一个类别。

这是我的查询:

$results = $this->Cart->find('all', 
        array(
          'contain' => array(
                'Product' => array('Category')
                 ),
          'conditions'=>array(
                               'OR' => array(
                                    'Product.title LIKE' => "%$query%", 
                                    'Category.name LIKE' => "%$query%"
                                     )
                             ),                                                  
          'fields'=>array('Product.title', 'Category.name'))

debug($results); exit;

查询无效!!看看这个:

 Error: SQLSTATE[42S22]: Column not found: 1054 Unknown column 'Category.name' in 'field list'

SQL Query: SELECT `Product`.`title`, `Category`.`name`, `Product`.`id` FROM `my_db`.`carts` AS `Cart` LEFT JOIN `my_db`.`products` AS `Product` ON (`Cart`.`product_id` = `Product`.`id`) WHERE ((`Product`.`title` LIKE '%apple%') OR (`Category`.`name` LIKE '%apple%')) 

如您所见,类别数据未附加到产品!如果我用一个简单的条件(例如'Category.name LIKE' => "%$query%")尝试相同的查询,则查询有效!所以我认为问题出在 OR 条件上,但我无法解决它......

有什么建议吗?

提前谢谢

【问题讨论】:

标签: cakephp find contain


【解决方案1】:

由于您尝试在不同表上的术语之间进行 OR,我相信您将不得不放弃此查询的关系并改为手动连接。通过手动加入,我认为您应该能够根据需要编写条件。也许是这样的?

 $this->Cart->recursive = -1;
 $results = $this->Cart->find('all', 
    array(
      'joins' => array(
            array(
                'table' => 'products',
                'alias' => 'Product',
                'conditions' => array(
                    'Product.cart_id = Cart.id',
                ),
            ),
      ),
      'conditions'=>array(
                           'OR' => array(
                                'Product.title LIKE' => "%$query%", 
                                'Category.name LIKE' => "%$query%"
                                 )
                         ),                                                  
      'fields'=>array('Product.title', 'Category.name'));

【讨论】:

    【解决方案2】:

    您正在应用主模型关联(购物车和产品)中不存在的条件(Category.name)。我不确定您的要求,但一个很好的起点是将查询更改为以下内容:

     $results = $this->Cart->find('all', 
            array(
              'contain' => array(
                  'Product' => array(
                      'Category' => array(
                          'conditions' => array('Category.name LIKE' => "%$query%"),
                          'fields' => array('Category.name')
                       )
                  )
               ),
              'conditions'=>array(
                  'Product.title LIKE' => "%$query%"
              ),                                                  
             'fields'=> array('Product.title')
            );
    

    请记住,这不是解决方案,您必须根据您的要求修改条件(如您所见,我删除了 OR 条件)

    【讨论】:

    • 删除查询有效的 OR 条件,但我知道(请参阅上面的原始问题)。我需要让它与 OR ...
    • 您想对不同级别的不同模型应用 OR 条件,类别(此处为条件)-> 产品(此处为条件)-> 购物车。恕我直言,您将无法仅通过一个查询来做到这一点(如果我错了,请告诉我们解决方案)。我也想recommend this plugin for complex searches
    猜你喜欢
    • 1970-01-01
    • 2012-11-03
    • 1970-01-01
    • 2013-12-18
    • 2015-04-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多