2012-03-23 4 views
0

私は3つのmySQLテーブルuser、section、user_section(結合テーブル)を持っています。ISNULLを使用してSQLクエリーをCodeManiterのDatamapper ORMに変換します

以下のSQL:

SELECT id, description, 
NOT ISNULL(
    (SELECT user_id 
    FROM user_section 
    WHERE user_section.section_id = section.id 
    AND user_id=5)) AS user_in_section 
FROM section 
WHERE site_id = 3 

はうまく次の結果を生成します。

id description user_in_section 
3 section1  1 
8 section2  0 
9 section3  1 

私は、ユーザーと彼らが属するセクションを編集するための私の見解でフォームを持っています。私は($ user_sectionsは、上記のデータが含まれている)ので、のようにチェックボックスを書いている:

<div class="checkboxes"> 
    <?php foreach ($users_sections as $row) { ?> 
    <label class="checkbox"><input <?= ($row->checked>0?'checked':'') ?> type="checkbox" name="section[]" value="<?= $row->id ?>" /> <?= $row->description ?></label></br> 
    <?php } ?> 
</div> 

私の質問は以下のとおりです。

SQLクエリを記述するためのより良い方法はありますか?それとも、私が望むデータを得るための唯一の方法ですか?

Datamapper ORMを使用してクエリを書きたいとします。 ISNULLは、単一引用符が正しいSQLであることからクエリを防止することでエスケープされている前に、私は今のところ...

$section 
->select('sections.id, description') 
->select_func('NOT ISNULL', array('(SELECT id FROM sections_site_users where sections_site_users.site_section_id=sections.id and sections_site_users.site_user_id='.$user_id.')'), 'checked') 
->where('site_id', $site_id) 
->get(); 

ないでこれを持っています。これをDatamapperで正しく書くにはどうしたらいいですか?

改善のためのご提案があれば幸いです。前もって感謝します。

EDIT:

私の作品解決策を発見した - ここでは、私のDataMapperのコードです:

$sections = new Section(); 
$sections 
    ->where('site_id', $site_id) 
    ->get(); 

foreach ($sections as $s) 
{ 
    $s2 = new Section(); 
    $s2 
     ->where('id', $s->id) 
     ->where_related('user', 'id', $user_id) 
     ->get(); 

    $s->checked = ($s2->exists() ? 1 : 0); 
} 

私の答えの上部のSQLと同じデータを生成します。しかし、より多くのデータベースクエリを使用します(私は1つのデータベースクエリでそれを行うことを望んでいました)。

私がここで一番良いことをしたことを誰にでも確認できますか?

ありがとうございます!

答えて

0

はい!単純に:

$user = new User(); 
$sections = $user->section->where('id', $site_id)->get_iterated(); 
foreach($sections as $section) 
{ 
    // $section->id 
    // $section->description 
} 

しかし、関係を適切に設定する必要があります。

すなわち:

クラスのユーザー: 公共の$にhas_many =配列( '節)。

クラスセクション: public $ has_many = array( 'user'); users_sections

Userテーブル:

は、テーブルがあるべき参加ユーザー セクションテーブル:セクション

編集: あなたが特定のサイトに特定のユーザーを持つセクションをしたいです。サイトとユーザーの間にはnの関係があります。だから、彼のセクションを取得し、その後、最初のユーザーのロード終了します:

$user = new User($user_id); 
if ($user->result_count()) 
{ 
    $sections = $user->section->where_related_site('id', $site_id)->get_iterated(); 
} 

これは問題ないはずです。申し訳ありませんが、最初は全部理解できませんでした。 あなたのモデルの簡単な説明は助けになるでしょう:)

+0

ありがとうございます。私の関係は正しく設定されていますが、私はget_iteratedをまだ使用していません。私の質問の一番上にあるSQLと同じようにDatamapperのコードを書く方法を教えてください。私はまだ詳細については不明です。どうも。 – sculptnz

+0

私のコードを試しましたか? $ user = new User(); $ sections = $ user-> section-> where( 'id'、$ site_id) - > get(); get_iteratedは "IteratorAggregate"を実装しているので、古典的なgetよりもはるかに高速です。要素のセットをループするときに使用する必要があります(doc:http://datamapper.wanwizard.eu/pages/getalt.html#get_iteratedを参照) – Spir

+0

これを十分に説明していないと申し訳ありませんが、私が欲しいものを理解していない。私の質問のトップにあるSQLを見て、それが生成する結果があれば、サイトのセクションのリストを取得していることがわかりますし、各セクションについては、1つまたは0つの特定のユーザーがそのセクションにあります。 とにかく、私は問題を解決するために働く解決策を持っています。 – sculptnz

関連する問題