user、section、および user_section (結合テーブル) の 3 つの mySQL テーブルがあります。
以下の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 を使用してクエリを記述したいと考えています。私はこれまでのところ...
$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();
ISNULL の前の NOT が一重引用符でエスケープされているため、クエリが正しい SQL になることができません。これを Datamapper で適切に記述するにはどうすればよいですか?
改善のための提案は大歓迎です。前もって感謝します。
編集:
私はうまくいく解決策を見つけました - ここに私の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 つのデータベース クエリで実行することを望んでいました)。
私がここで最高のことをしたことを誰かが確認できますか?
ありがとう!