У меня есть 3 таблицы mySQL: пользователь, раздел и user_section (соединительная таблица).Перевести SQL-запрос, используя ISNULL в Datamapper ORM для Codeigniter
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? Или у меня есть хороший/единственный способ получить данные, которые я хочу?
Я хочу использовать ORM Datamapper, чтобы написать запрос. У меня это до сих пор ...
$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?
Любые предложения по улучшению очень ценятся. Заранее спасибо.
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 в верхней части моего ответа. Однако он использует больше запросов к базе данных (я надеялся сделать это в одном запросе базы данных).
Может ли кто-нибудь подтвердить, что я сделал лучшее здесь?
Спасибо!
Спасибо, Spir, у меня есть правильные отношения, но я еще не использовал get_iterated - так что я попробую. Любой шанс, что вы могли бы помочь мне с тем, как написать код Datamapper, чтобы достичь того же, что и мой SQL, в верхней части моего вопроса? Я все еще неясен в деталях. Спасибо. – sculptnz
Вы попробовали мой код: $ user = new User(); $ sections = $ user-> section-> где ('id', $ site_id) -> get(); get_iterated намного быстрее, чем классический, поскольку он реализует «IteratorAggregate». Вы должны использовать его, когда вы перебираете набор элементов (см. Doc: http://datamapper.wanwizard.eu/pages/getalt.html#get_iterated) – Spir
Извините, если я не объяснил это достаточно хорошо ... но вы не поняли, чего я хочу. Если вы посмотрите на SQL в верхней части моего вопроса и результаты, которые он производит, вы увидите, что я получаю список разделов для сайта, а затем для каждого раздела я получаю 1 или 0 для того, конкретный пользователь находится в этом разделе. В любом случае у меня есть решение, которое работает, поэтому я закрою вопрос. – sculptnz