繁体   English   中英

使用ISNULL将SQL查询转换为Codeigniter的Datamapper ORM

[英]Translate an SQL query using ISNULL into Datamapper ORM for Codeigniter

我有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之前的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相同的数据。 但是,它确实使用了更多的数据库查询(我希望在一个数据库查询中进行查询)。

谁能为我确认我在这里做得最好?

谢谢!

是! 只是:

$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();
}

没关系 抱歉,我一开始并不了解所有内容。 对模型的简短描述会有所帮助:)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM