0

internet_access_codesradacctの 2 つのテーブルがあります。internet_access_codesには多数
のradacctレコードがあります。 ジョインは
internet_access_codes.code = radacct.username AND internet_access_codes.fk_ship_id = radacct.fk_ship_id

2 つのモデルを作成し$hasMany、それぞれ およびを使用して、 およびinternet_access_codes$belongsToレコードを取得するときに関連する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'
        )
    ),
);

}

internet_access_codesfind()からレコードを取得すると、関連するすべての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 Radacct. idRadacctfk_ship_idRadacctradacctidRadacctacctsessionidRadacctacctuniqueidRadacctusernameRadacctgroupnameRadacctrealmRadacctnasipaddressRadacctnasportidRadacctnasporttypeRadacctacctstarttimeRadacctacctstoptimeRadacctacctsessiontimeRadacctacctauthenticRadacctconnectinfo_startRadacctconnectinfo_stopRadacctacctinputoctetsRadacctacctoutputoctetsRadacctcalledstationidRadacctcallingstationidRadacctacctterminatecauseRadacctservicetypeRadacctframedprotocolRadacctframedipaddressRadacctacctstartdelayRadacctacctstopdelayRadacctxascendsessionsvrkeyどこ からradacctでも。= . そして。= . そして。<> 1RadacctInternetAccessCodecodeRadacctusernameInternetAccessCodefk_ship_idRadacctfk_ship_idRadacctdeleted

念のため app_model に包含可能な動作も追加しましたが、違いはありませんでした。

4

1 に答える 1

3

残念ながら、cakephp は、外部キー =false および条件との関連付けではうまく機能しません。関連付けの条件は、Model.field = 1 またはその他の定数のようなものであることが期待されます。

has many association は、最初に現在のモデルの結果をすべて見つけ、次に現在のモデルの結果foreignKeyを持つ他のすべてのモデルの結果を見つけます...つまり、2つのクエリを実行します。条件を指定すると、とにかく実行しようとしますが、結合を実行しなかったため、クエリは別のテーブルの列を見つけられません。

解決

結合または関連付けの代わりに結合を使用して、結合を強制します。詳細については、こちらを参照してください。

join の使用例

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

考えられる解決策 #2

Belongs自動結合を実行するため (常にではありません)、radaact から検索を実行できますが、このソリューションの悪い点は、すべての radacct を一覧表示し、internetAccesCode と関連付けられているすべての radaact の代わりに、internetAccesCode を関連付けることです。ソリューションに参加すると、似たようなものが得られます...

結果を整理する素敵な foreach を実行する必要があります :S それは難しいことではありません....

これで問題が解決することを願っています。

于 2011-09-21T19:45:43.337 に答える