У меня есть 3 таблицы mySQL: user, section и user_section (объединяющая таблица).
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 экранируется одинарными кавычками, мешающими запросу быть правильным 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 в верхней части моего ответа.Однако он использует больше запросов к базе данных (я надеялся сделать это одним запросом к базе данных).
Может ли кто-нибудь подтвердить для меня, что я сделал здесь лучшее?
Спасибо!