我有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相同的数据。但它确实使用了更多的数据库查询(我希望在一个数据库查询中执行此操作)。
有人能证实我在这里做过最好的事吗?
谢谢!
答案 0 :(得分:0)
是的!简单地:
$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
用户表:用户 部分表:部分
修改强> 您需要具有给定站点的特定用户的部分。您在站点和用户之间有n个关系。因此,您将首先加载用户,然后获取他的部分:
$user = new User($user_id);
if ($user->result_count())
{
$sections = $user->section->where_related_site('id', $site_id)->get_iterated();
}
这应该没问题。对不起我起初并不了解所有内容。 您的模型的简短描述会有所帮助:)