我有 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 相同的数据。然而,它确实使用了更多的数据库查询(我希望在一个数据库查询中做到这一点)。
谁能为我确认我在这里做了最好的事情?
谢谢!