0

私は2つのテーブルtbl_entriesとtbl_votingsを持っています

tbl_entries -> id, othercolums
tbl_votings -> id, entry_id, othercolumns

ユーザーがエントリに投票した場合、tbl_entriesからzii.widgets.CListViewにデータを表示したいと思います。

以下のSQLクエリを正常に実行できます。

select * from tbl_entries where id in (select tbl_entries.id from tbl_votings where entry_id = tbl_entries.id ) 

結果をCListViewに表示できるように、YIIスタイルで行うにはどうすればよいですか?

4

2 に答える 2

1

Entriesモデル追加関係で:

...
'votes' => array(self::HAS_MANY, 'Votings', 'entry_id'),
...

次に、AR で検索します。

$records = Entries::model()->with('votes')->findAll();

お役に立てれば。

于 2012-04-07T06:45:13.400 に答える
0

更新しました

わかりました。投稿に「if」という単語がありませんでした。ユーザーが投票した場合にのみエントリが必要だと思いました。正しいコードについては、以下の更新をお読みください。将来必要になった場合に備えて、最初の部分は残しておきます。INNER JOINは、そのエントリに少なくとも1票がある場合にのみエントリを取得します。

------------------最初の部分(間違っている)--------------------

Entriesモデル内で関係を宣言します。

public function relations() {
    return array(
        'votes' => array(self::HAS_MANY, 'Votings', 'entry_id'),
    );

}

また、データプロバイダーを作成するときは、次のようにします。

$dataProvider = new CActiveDataProvider('Entries',
    array(
        'criteria' => array(
            'with' => array(
                'votes'=>array(
                    'joinType' => 'INNER JOIN'
                )
            )
        )
    )
);

これにより、上記で記述したSQLは作成されませんが、正しい方法で作成されます。SQLは次のようになります。

select * from tbl_entries t INNER JOIN tbl_votings v ON t.id = v.entry_id

-----------------第2部(右)------------------

アップデート

さて、単にエントリを取得して投票する必要がある場合は、最初の部分から同じ関係宣言を行います。

public function relations() {
    return array(
        'votes' => array(self::HAS_MANY, 'Votings', 'entry_id'),
    );

}

そして、次のようにデータプロバイダーを作成します。

$dataProvider = new CActiveDataProvider('Entries',
    array(
        'criteria' => array(
            'with' => array('votes')
        )
    )
);
于 2012-04-07T15:35:37.813 に答える