2012-03-23 1 views
0

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

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

Спасибо!

ответ

0

Да! Просто:

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

Но вы должны установить правильное отношение!

т.е.

пользователя

Класс: публика $ has_many = массив (раздел ');

Раздел класса: public $ has_many = array ('user');

Регистрация таблица должна быть: users_sections

стол пользователя: пользователи секции стола: разделы

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

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

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

+0

Спасибо, Spir, у меня есть правильные отношения, но я еще не использовал get_iterated - так что я попробую. Любой шанс, что вы могли бы помочь мне с тем, как написать код Datamapper, чтобы достичь того же, что и мой SQL, в верхней части моего вопроса? Я все еще неясен в деталях. Спасибо. – sculptnz

+0

Вы попробовали мой код: $ user = new User(); $ sections = $ user-> section-> где ('id', $ site_id) -> get(); get_iterated намного быстрее, чем классический, поскольку он реализует «IteratorAggregate». Вы должны использовать его, когда вы перебираете набор элементов (см. Doc: http://datamapper.wanwizard.eu/pages/getalt.html#get_iterated) – Spir

+0

Извините, если я не объяснил это достаточно хорошо ... но вы не поняли, чего я хочу. Если вы посмотрите на SQL в верхней части моего вопроса и результаты, которые он производит, вы увидите, что я получаю список разделов для сайта, а затем для каждого раздела я получаю 1 или 0 для того, конкретный пользователь находится в этом разделе. В любом случае у меня есть решение, которое работает, поэтому я закрою вопрос. – sculptnz