CakePHP $还没有从$ belongsTo模型中提取数据。未创建加入

时间:2011-09-21 09:17:12

标签: cakephp cakephp-1.3 cakephp-appmodel

我有两张桌子: internet_access_codes radacct
internet_access_codes 包含多条 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
        (
        )

)
  

错误:警告(512):SQL错误:1054:未知列   'where子句'中的'InternetAccessCode.code'   [CORE / cake / libs / model / datasources / dbo_source.php,第684行]

     

查询:SELECT RadacctidRadacctfk_ship_id,   RadacctradacctidRadacctacctsessionid,   RadacctacctuniqueidRadacctusernameRadacctgroupname,   RadacctrealmRadacctnasipaddressRadacctnasportid,   RadacctnasporttypeRadacctacctstarttime,   RadacctacctstoptimeRadacctacctsessiontime,   RadacctacctauthenticRadacctconnectinfo_start,   Radacctconnectinfo_stopRadacctacctinputoctets,   RadacctacctoutputoctetsRadacctcalledstationid,   RadacctcallingstationidRadacctacctterminatecause,   RadacctservicetypeRadacctframedprotocol,   RadacctframedipaddressRadacctacctstartdelay,   RadacctacctstopdelayRadacctxascendsessionsvrkey FROM   radacct AS Radacct WHERE InternetAccessCodecode =   RadacctusernameInternetAccessCodefk_ship_id =   Radacctfk_ship_idRadacctdeleted<> 1

在app_model中我还添加了可包含的行为以防万一,但没有区别。

1 个答案:

答案 0 :(得分:3)

可悲的是,对于外键= false和条件的关联,cakephp不能很好地工作。关联中的条件应该是Model.field = 1或任何其他常量。

有许多关联首先找到所有当前模型结果,然后它找到所有其他模型结果,其中当前模型结果为foreignKey ...意味着它执行2次查询。如果您设置条件,它会尝试执行此操作,但由于它没有进行连接,您的查询将找不到另一个表的列。

解决方案

使用连接而不是包含或关联来强制连接,您可以找到更多here

如何使用join

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

可能的解决方案#2

BelongsTo执行自动连接(并不总是),你可以从radaact做一个发现,这个解决方案的坏处是,它将列出所有radacct并将其internetAccesCode取消,而不是internetAccesCode和所有radaact关联.. ..加入解决方案会给你类似的东西......

你需要做一个很好的foreach来组织你的结果:S虽然不会很难....

希望这能解决你的问题。