我有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=数组('ssection);
类别部分:public$has_many=数组('user');
联接表应为:users_sections
用户表:用户截面表:截面
编辑:您想要的分区具有给定站点的特定用户。站点和用户之间存在n关系。因此,您将首先加载用户,然后获取他的部分:
$user = new User($user_id);
if ($user->result_count())
{
$sections = $user->section->where_related_site('id', $site_id)->get_iterated();
}
这应该没问题。对不起,我一开始没有完全理解。对您的模型进行简短描述会有所帮助:)