2013-11-28 44 views
1

爲什麼我的全局屬於模型中未定義的條件?全局屬於模型中未定義的條件(CakePHP v2.4.2)

我正在使用CakePHP v2.4.2。

在模型Order.php

public $belongsTo = array(
..., 
'Agent' => array(
    'className' => 'Party', 
    'foreignKey' => 'agent_id', 
    'conditions' => array(...) 
), 
... 

在控制器OrdersController.php

$agents = $this->Order->Agent->find('list'); 

在渲染視圖下面SQL語句被施加

SELECT `Agent`.`id`, `Agent`.`name` FROM `zeevracht2`.`parties` AS `Agent` WHERE 1 = 1; 

我嘗試不同的條件,但不被施加甚至含有true一個簡單的字符串(而$this->Order->Agent->find();內添加此條件PartiesController.php正常工作:

$agents = $this->Order->Agent->find('list', array(
    'conditions' => array('true') 
)); 

導致:

SELECT `Agent`.`id`, `Agent`.`name` FROM `zeevracht2`.`parties` AS `Agent` WHERE true; 

回答

2

在IRC上進行合作後,我發現我自己的問題的答案。

在查詢Order時,模型的belongsTo條件中的條件似乎只適用於JOIN

我試圖過濾特定角色的Party,例如, Agent,這是Party的別名,其角色是代理。因此,該協會應該以代理人角色爲條件。理想情況下,這會自動調節任何$this->Order->Agent->find()調用。但不幸的是,這是不可能的,因爲在CakePHP第3版的開發中正在解決一個技術問題。

解決方法是在關聯上有兩種類型的條件:一種用於JOIN,另一種用於關聯本身。

爲什麼一個爲JOIN?例如。當Post屬於User時,但只應顯示post.validated

+0

對於那些有興趣的人:我創建了一個Github問題:https://github.com/cakephp/cakephp/issues/2405 –

0

如果您試圖查找特定Order所屬的Agent,那麼在查詢訂單時應該返回記錄。因此,像:

<?php 
class OrdersController extends AppController { 

    public function view($id) { 
     $order = $this->Order->findById($id); 
     pr($order); exit; 
    } 
} 

應該產生這樣的:

Array 
(
    [Order] => Array 
     (
      [id] => 83 
      … 
     ) 

    [Agent] => Array 
     (
      [id] => 1 
      … 
     ) 
) 

在你的問題,你再進行額外的模型調用,比如$this->Order->Agent->find('list');,這是製作查詢,這將獲取所有代理商沒有條件。您通過true的密鑰conditions將不會產生任何影響,因爲這不是一個條件。條件應該是一個數組,像這樣:

$this->Order->Agent->find('all', array(
    'conditions' => array(
     'Agent.id' => 1 
    ) 
)); 

但正如我所說,如果你的Order新型屬於你的Agent模式,那麼你應該得到Agent結果集返回,當你得到你的Order結果集。如果沒有,嘗試添加中可容納的行爲您Order型號:

<?php 
class Order extends AppModel { 

    public $actsAs = array(
     'Containable' 
    ); 
} 
+0

我的條件是有效的,因爲它_is_一個數組。我沒有試圖找到'訂單'屬於的'代理'。這由CakePHP通過'belongsTo'屬性的'foreignKey'選項自動完成。我試圖用作爲代理的角色集過濾「Party」。通過'AppModel'將可封裝添加到每個模型。我可以很容易地將我所需的條件設置爲每個'$ this-> Order-> Agent-> find();',但**我不想**重複自己(DRY)。我使用了很多'find()'調用,這是一個很大的應用程序。 –

+0

''conditions'=> array('true')'is * not *一個有效的條件數組。您實際上需要該陣列中的一些條件。 –

+0

我們是在討論技術的正確性還是語境的有效性?我同意簡單地傳遞'array('true')'在它的上下文中是無效的,因爲你實際上需要一些條件。 'WHERE true'總是評估爲'true',就像'WHERE 1 = 1'一樣,基本上是一樣的。它用於測試目的。如果你喜歡,我也可以使用'[model] .id = 1'。我也使用後者,這隻取決於我目前的感受;-)。但技術方面,這很好。 CakePHP只是將數組中的任何獨立字符串添加到WHERE子句中。 我很樂意與您討論這個問題,但讓我們專注於這個問題。 –

0

試試這個:

public $belongsTo = array(
..., 
'Agent' => array(
    'className' => 'Party', 
    'foreignKey' => false, 
    'conditions' => array('joinField'=>'joinedField', ...more conditions) 
),