私は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つのデータベースクエリでそれを行うことを望んでいました)。
私がここで一番良いことをしたことを誰にでも確認できますか?
ありがとうございます!
ありがとうございます。私の関係は正しく設定されていますが、私はget_iteratedをまだ使用していません。私の質問の一番上にあるSQLと同じようにDatamapperのコードを書く方法を教えてください。私はまだ詳細については不明です。どうも。 – sculptnz
私のコードを試しましたか? $ 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
これを十分に説明していないと申し訳ありませんが、私が欲しいものを理解していない。私の質問のトップにあるSQLを見て、それが生成する結果があれば、サイトのセクションのリストを取得していることがわかりますし、各セクションについては、1つまたは0つの特定のユーザーがそのセクションにあります。 とにかく、私は問題を解決するために働く解決策を持っています。 – sculptnz