0

我有两个表:internet_access_codesradacctinternet_access_codes
许多 radacct记录。 加入是
internet_access_codes.code = radacct.username AND internet_access_codes.fk_ship_id = radacct.fk_ship_id

我创建了 2 个模型并想分别使用$hasMany和,$belongsTo以便在获取和internet_access_codes记录时会提取相关的radacct记录。

这是代码:

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 行]

查询:选择Radacctid, 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从哪里来 。radacct_ Radacct_ = 。和。= 。和。<> 1InternetAccessCodecodeRadacctusernameInternetAccessCodefk_ship_idRadacctfk_ship_idRadacctdeleted

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

4

1 回答 1

3

可悲的是,cakephp 在与外键 =false 和条件的关联方面效果不佳。关联中的条件应该是 Model.field = 1 或任何其他常量。

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

解决方案

使用连接而不是包含或关联来强制连接,您可以在此处找到更多信息

如何使用连接的示例

$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 虽然不会很难....

希望这能解决您的问题。

于 2011-09-21T19:45:43.337 回答