0

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 つのデータベース クエリで実行することを望んでいました)。

私がここで最高のことをしたことを誰かが確認できますか?

ありがとう!

4

1 に答える 1

0

はい!単に:

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

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

すなわち:

クラス ユーザー: public $has_many = array('section);

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

結合テーブルは次のようにする必要があります: users_sections

ユーザー テーブル: ユーザー セクション テーブル: セクション

編集: 特定のサイトの特定のユーザーがいるセクションが必要です。サイトとユーザーの間に関係があります。したがって、最初に User のロードを終了してから、彼のセクションを取得します。

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

これで問題ないはずです。ごめん、最初全然わからなかった。モデルの簡単な説明が役立ちます:)

于 2012-03-23T15:11:30.037 に答える