2011-09-21 112 views
0

我有兩個表:internet_access_codesradacct
internet_access_codes的hasMany radacct記錄。
聯接是internet_access_codes.code = radacct.username AND internet_access_codes.fk_ship_id = radacct.fk_ship_id

我創建了2種型號,想分別使用$hasMany$belongsTo使相關radacct記錄將獲取和internet_access_codes記錄時拉。

下面的代碼:

class InternetAccessCode extends AppModel{ 
var $name = 'InternetAccessCode'; 
var $hasMany = array(
    'Radacct' => array(
     'className' => 'Radacct', 
     'foreignKey'=> false, 
     'conditions'=> array(
      'InternetAccessCode.code = Radacct.username', 
      'InternetAccessCode.fk_ship_id = Radacct.fk_ship_id' 
     ), 
    ) 
); 

}

class Radacct extends AppModel{ 
var $name = 'Radacct'; 
var $useTable = 'radacct'; 

var $belongsTo = array(
    'InternetAccessCode' => array(
     'className' => 'InternetAccessCode', 
     'foreignKey' => false, 
     'conditions'=> array(
      'InternetAccessCode.code = Radacct.username', 
      'InternetAccessCode.fk_ship_id = Radacct.fk_ship_id' 
     ) 
    ), 
); 

}

當我find()internet_access_codes我期待有一個記錄它給我的所有相關radacct記錄。但是,我收到了一個錯誤,因爲它沒有進行連接。

這裏的結果和錯誤:

Array 
(
    [InternetAccessCode] => Array 
     (
      [id] => 1 
      [code] => 1344444440 
      [bandwidth_allowed] => 20000 
      [time_allowed] => 30000 
      [expires_at] => 31536000 
      [cost_price] => 0.00 
      [sell_price] => 0.00 
      [enabled] => 1 
      [deleted] => 0 
      [deleted_date] => 
      [fk_ship_id] => 1 
      [downloaded_at] => 2011-09-10 22:18:14 
     ) 

    [Radacct] => Array 
     (
     ) 

) 

Error: Warning (512): SQL Error: 1054: Unknown column 'InternetAccessCode.code' in 'where clause' [CORE/cake/libs/model/datasources/dbo_source.php, line 684]

Query: SELECT Radacct . id , Radacct . fk_ship_id , Radacct . radacctid , Radacct . acctsessionid , Radacct . acctuniqueid , Radacct . username , Radacct . groupname , Radacct . realm , Radacct . nasipaddress , Radacct . nasportid , Radacct . nasporttype , Radacct . acctstarttime , Radacct . acctstoptime , Radacct . acctsessiontime , Radacct . acctauthentic , Radacct . connectinfo_start , Radacct . connectinfo_stop , Radacct . acctinputoctets , Radacct . acctoutputoctets , Radacct . calledstationid , Radacct . callingstationid , Radacct . acctterminatecause , Radacct . servicetype , Radacct . framedprotocol , Radacct . framedipaddress , Radacct . acctstartdelay , Radacct . acctstopdelay , Radacct . xascendsessionsvrkey FROM radacct AS Radacct WHERE InternetAccessCode . code = Radacct . username AND InternetAccessCode . fk_ship_id = Radacct . fk_ship_id AND Radacct . deleted <> 1

在app_model我還增加了中可容納的行爲,以防萬一,但它並沒有區別。

+1

請發表您的'find()'。 – Dunhamzzz

回答

3

可悲的是,cakephp與外鍵= false和條件的關聯不能很好地工作。預期關聯中的條件是諸如Model.field = 1或任何其他常數的事物。

的有許多聯想首先找到了目前所有的模型結果,然後查找所有具有當前模型結果ForeignKey的其他模型結果...這意味着它2個查詢。如果你把它的條件,它會盡力做到這一點,但因爲它沒有做一個連接你的查詢將無法找到另一個表的列。

解決方案

使用聯接,而不是包含或關聯強制聯接,你可以找到更多的here

如何使用加入一個例子

$options['joins'] = array(
    array(
     'table' => 'channels', 
     'alias' => 'Channel', 
     'type' => 'LEFT', 
     'conditions' => array(
      'Channel.id = Item.channel_id', 
     ) 
    )); 
$this->Model->find('all', $options); 

可能的解決方法#2

屬於執行自動連接(並非總是),你可以從radaact中找到,這個解決方案的壞處在於它將列出所有的radacct,並把它的internetAccesCode asociated而不是internetAccesCode和所有相關的Radaact ....加入解決方案會給你類似的東西,雖然...

你需要做一個很好的foreach,組織你的結果:雖然它不會很難,但....

希望這可以解決您的問題。

+0

我會給你一個鏡頭謝謝! – manospro