Перевести SQL-запрос с использованием ISNULL в Datamapper ORM для Codeigniter - PullRequest
0 голосов
/ 23 марта 2012

У меня есть 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 в верхней части моего ответа.Однако он использует больше запросов к базе данных (я надеялся сделать это одним запросом к базе данных).

Может ли кто-нибудь подтвердить для меня, что я сделал здесь лучшее?

Спасибо!

1 Ответ

0 голосов
/ 23 марта 2012

Да!Просто:

$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

Таблица пользователей: таблица разделов пользователей: section

Редактировать: Вы хотите раздел, который имеет конкретного пользователя для данного сайта.У вас есть отношения между сайтами и пользователями.Таким образом, вы сначала прекратите загрузку пользователя, а затем получите его раздел:

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

Это должно быть хорошо.Извините, я сначала не поняла.Краткое описание вашей модели поможет:)

...