2014-11-23 55 views
0

我正在嘗試獲取低庫存>庫存的產品。使用CakePHP查詢時出現錯誤結果

爲什麼我在CakePHP查詢中出現錯誤的結果?

使用CakePHP自定義查詢它工作正常。但是默認的分頁查詢結果是錯誤的。

我有產品和類別模型之間的關聯。

控制器代碼:

$condition = array('Product.status =' => 1, 'Product.is_deleted !=' => 1, 
'Product.low_stock_alert != ' => 0, 'Product.low_stock_alert >' => 'Product.stock'); 

    $this->paginate = array('fields' => array('Product.id', 'Product.name', 
'Product.code', 'Product.stock_type','Product.low_stock_alert', 
'Product.stock','category.name'),'conditions' => $condition, 'limit' => Configure::read('LIST_PROD_NUM_RECORDS'),'order' => 'Product.id ASC'); 

查詢生成:

SELECT `Product`.`id`, `Product`.`name`, `Product`.`code`, `Product`.`stock_type`, 
`Product`.`stock`, `category`.`name` FROM `shopping`.`products` AS `Product` LEFT 
JOIN `shopping`.`categories` AS `Category` ON (`Product`.`category_id` = 
`Category`.`id`) LEFT JOIN `shopping`.`users` AS `AddedBy` ON (`Product`.`added_by` 
= `AddedBy`.`id`) LEFT JOIN `shopping`.`users` AS `ModifiedBy` ON 
(`Product`.`modified_by` = `ModifiedBy`.`id`) WHERE `Product`.`status` = 1 AND 
`Product`.`is_deleted` != 1 AND `Product`.`low_stock_alert` != 0 AND 
`Product`.`low_stock_alert` > 'Product.stock' ORDER BY `Product`.`id` ASC LIMIT 100 

模型 - > Product.php

class Product extends AppModel { 

    public $name = 'Product'; 
    public $cacheQueries = false; 
    public $actsAs = array('Containable'); 
    public $belongsTo = array(
     'Category' => array(
      'className' => 'Category', 
      'foreignKey' => 'category_id', 
      'fields' => array('name', 'description', 'stock_type', 'qrt_per', 'half_per', 'three_forth_per') 
     ), 
     'AddedBy' => array(
      'className' => 'User', 
      'foreignKey' => 'added_by', 
      'fields' => array('first_name', 'last_name', 'email') 
     ), 
     'ModifiedBy' => array(
      'className' => 'User', 
      'foreignKey' => 'modified_by', 
      'fields' => array('first_name', 'last_name', 'email') 
     ) 
    ); 
} 

型號 - > Category.php

class Category extends AppModel { 
    var $name = 'Category'; 
    public $cacheQueries = false; 
    public $belongsTo = array(
     'AddedBy' => array(
      'className' => 'User', 
      'foreignKey' => 'added_by', 
      'fields' => array('first_name', 'last_name', 'email') 
     ), 
     'ModifiedBy' => array(
      'className' => 'User', 
      'foreignKey' => 'modified_by', 
      'fields' => array('first_name', 'last_name', 'email') 
     ) 
    ); 
    public $hasMany = array(
     'Product' => array(
      'className' => 'Product', 
      'order' => 'Product.created DESC' 
     ) 
    ); 
} 

錯誤結果:

enter image description here

但有了這個下面定義查詢我得到準確的結果:

$data = $this->Product->Query("SELECT products.*, categories.name, categories.description, categories.stock_type, categories.qrt_per, categories.half_per, categories.three_forth_per, AddedBy.first_name, AddedBy.last_name, AddedBy.email, ModifiedBy.first_name, ModifiedBy.last_name, ModifiedBy.email FROM sunnaair_kaziDB.products AS products LEFT JOIN sunnaair_kaziDB.categories AS categories ON (products.category_id = categories.id) LEFT JOIN sunnaair_kaziDB.users AS AddedBy ON (products.added_by = AddedBy.id) LEFT JOIN sunnaair_kaziDB.users AS ModifiedBy ON (products.modified_by = ModifiedBy.id) WHERE products.status = 1 AND products.is_deleted != 1 AND products.low_stock_alert != 0 AND products.low_stock_alert > products.stock ORDER BY products.id ASC LIMIT 50"); 

回答

3

你問題在於這種情況:

'Product.low_stock_alert >' => 'Product.stock' 

在Cake中,'Product.stock'不讀爲表名,而是作爲文字字符串讀取。請參閱在生成的SQL微妙的錯誤:

AND `Product`.`low_stock_alert` > 'Product.stock' 

爲了解決這個問題,請嘗試更改條件:

'Product.low_stock_alert > Product.stock' 

所以整個行變成了:

$condition = array('Product.status =' => 1, 'Product.is_deleted !=' => 1, 
'Product.low_stock_alert != ' => 0, 'Product.low_stock_alert > Product.stock'); 

記住以下內容:=>用於轉義。在將列與列進行比較時不要使用它。您甚至可以將這些條件一起使用=>轉儲,因爲這裏沒有針對SQL注入攻擊的向量。

+0

嘿詹姆斯..我感謝你的努力。這個問題需要我很多時間。謝謝 – 2014-11-23 07:31:16

相關問題