2013-03-22 100 views
1

這是我的第一個問題。我在cakephp 1.3中遇到了一個可容忍行爲的問題。問題是如下:我有一個交付模型下列協會:CakePHP 1.3包含不正確建立關聯

class Deliverable extends AppModel { 
    var $name = 'Deliverable'; 
    var $displayField = 'name'; 
    var $actsAs = array('Containable'); 

    var $belongsTo = array(
    'Asset' => array(
     'className' => 'Asset', 
     'foreignKey' => 'asset_id', 
     'dependent' => false 
    ), 
    'DelRouteName' => array(
     'className' => 'DelRouteName', 
     'foreignKey' => 'del_route_name_id', 
    ), 
    'AccessGroup' => array(
     'className' => 'AccessGroup', 
     'foreignKey' => false, 
     'conditions' => 
      'Deliverable.role_id = AccessGroup.id' 
    ) 
); 

    var $hasOne = array(
    'Artifact' => array(
     'className' => 'Artifact', 
     'foreignKey' => 'deliverable_id', 
     'dependent' => true, 
    ) 
); 

    var $hasMany = array(
    'Delivery' => array(
     'className' => 'Delivery', 
     'foreignKey' => 'deliverable_id', 
     'dependent' => true, 
     'order' => 'Delivery.gmt_created', 
    ) 
); 

這裏是的分頁設置的配置:

$this->paginate['Deliverable'] = array_merge($this->paginate['Deliverable'], array(
     'limit' => $this->getSysPref('items_per_page', 20), 
     'conditions' => array(
      'Deliverable.role_id' => $this->myRoleSetIds(), 
      'Deliverable.asset_id' => $asset['Asset']['id'], 
      'Delivery.gmt_created >' => $keep_time 
     ), 
     'order' => 'Deliverable.name', 
     'contain' => array(
      'AccessGroup', 
      'Delivery' => array(
       'conditions' => array(
        'Delivery.gmt_created >' => $keep_time 
       ), 
       'limit' => 1, 
       'order' => 'Delivery.gmt_created DESC'      
      ), 
      'DelRouteName' 
     ) 
    )); 
    $deliverables = $this->paginate('Deliverable'); 

正如你可以看到,中容納行爲附加,定義的關聯以及包含的關聯模型(在分頁配置部分中)。

我遇到的這個問題是它能夠成功地查詢包含的模型「AccessGroup」和「DelRouteName」,但它沒有獲取關聯的「Delivery」數據。如果我在父模型(Deliverable)上設置了一個針對子模型(Delivery)的條件,則只會顯示錯誤,這是我之前完成的並且完全合法。我得到這個SQL錯誤,正如你所看到的,表交付根本沒有加入,但access_groups和del_route_names是。

這裏是蛋糕構建SQL:

SELECT "Deliverable"."id" AS "Deliverable__id", "Deliverable"."name" AS 
"Deliverable__name", "Deliverable"."artifact_name" AS "Deliverable__artifact_name", 
"Deliverable"."type" AS "Deliverable__type", "Deliverable"."asset_id" AS 
"Deliverable__asset_id", "Deliverable"."del_route_name_id" AS 
"Deliverable__del_route_name_id", "Deliverable"."artifact_id" AS 
"Deliverable__artifact_id", "Deliverable"."status" AS "Deliverable__status", 
"Deliverable"."delivery_id" AS "Deliverable__delivery_id",       
"Deliverable"."deliverable_id" 
AS "Deliverable__deliverable_id", "Deliverable"."gmt_created" AS 
"Deliverable__gmt_created", "Deliverable"."locked" AS "Deliverable__locked", 
"Deliverable"."frozen" AS "Deliverable__frozen", "Deliverable"."cloaked" AS 
"Deliverable__cloaked", "Deliverable"."role_id" AS "Deliverable__role_id", 
"DelRouteName"."id" AS "DelRouteName__id", "DelRouteName"."name" AS      
"DelRouteName__name", 
"DelRouteName"."type" AS "DelRouteName__type", "AccessGroup"."id" AS "AccessGroup__id", 
"AccessGroup"."name" AS "AccessGroup__name", "AccessGroup"."dn" AS "AccessGroup__dn", 
"AccessGroup"."filters" AS "AccessGroup__filters", "AccessGroup"."paths" AS 
"AccessGroup__paths" FROM "deliverables" AS "Deliverable" LEFT JOIN "del_route_names" 
AS "DelRouteName" ON ("Deliverable"."del_route_name_id" = "DelRouteName"."id") LEFT  
JOIN "access_groups" AS "AccessGroup" ON ("Deliverable"."role_id" = "AccessGroup"."id")  
WHERE "Deliverable"."role_id" = ('0') AND "Deliverable"."asset_id" = '2' AND 
"Delivery"."gmt_created" > '1361391936' ORDER BY "Deliverable"."name" ASC LIMIT 50 

這給了我這個錯誤(使用PostgreSQL)

Warning (2): pg_query() [http://php.net/function.pg-query]: Query failed: ERROR: missing FROM-clause entry for table "Delivery" 

我不知所措就在這裏,所以任何幫助將不勝感激。讓我知道你是否還需要更多信息。

+0

使用I加入子句PSQL命令行'LEFT JOIN 「交付」 爲 「傳送」 ON( 「交貨」, 「deliverable_id」= 「Deliverable.id)其中, 」交貨「,」 gmt_created」> 1 (我剛剛用一個例子) – 2013-03-22 20:42:36

回答

0

您無法從主模型中調整包含的模型。在執行contain()時,CakePHP爲每個模型使用不同的查詢。如果您需要添加交叉模型的條件,則需要使用JOINs

+0

我很好奇,因爲這不是我所學到的。蛋糕建立查詢的方式允許您爲主要模型提供針對兒童模型的條件,只要它們被包含在這裏,我分頁爲一個HABTM,它針對的是孩子(連接表)模型,但是附加到父模型上......這很好地工作: – 2013-03-25 15:36:40

+0

'$ this-> paginate ['Asset' ] = array_merge($ this-> paginate ['Asset'],array( \t \t \t'conditions'= >陣列( \t \t \t \t 'Asset.role_id'=> $這 - > myRoleSetIds(), \t \t \t \t「ProductsAsset。PRODUCT_ID」 => $ ID \t \t \t) \t '包含'=>數組( \t \t 'ProductsAsset', \t \t 'AccessGroup' \t \t \t )\t \t \t )); $ assets = $ this-> paginate('Asset');' – 2013-03-25 15:37:05

+0

上述代碼完美地工作,並基於子模型的product_id過濾主模型。 – 2013-03-25 15:38:12

0

更新後的代碼現在可以在Dave的幫助下工作。

$this->paginate['Deliverable'] = array_merge($this->paginate['Deliverable'], array(
      'limit' => $this->getSysPref('items_per_page', 20), 
      'conditions' => array(
       'Deliverable.role_id' => $this->myRoleSetIds(), 
       'Deliverable.asset_id' => $asset['Asset']['id'], 
       'Delivery.gmt_created >' => $keep_time 
      ), 
      'joins' => array(
       array(
        'table' => 'deliveries', 
        'alias' => 'Delivery', 
        'type' => 'LEFT', 
        'conditions' => array(
         'Deliverable.id = Delivery.deliverable_id' 
        ) 
       ) 
      ), 
      'order' => 'Deliverable.name', 
      'contain' => array(
       'AccessGroup', 
       'Delivery' => array(
        'conditions' => array(
         'Delivery.gmt_created >' => $keep_time 
        ), 
        'limit' => 1, 
        'order' => 'Delivery.gmt_created DESC'      
       ), 
       'DelRouteName' 
      ) 
     ));