我正在构建一个可以使合唱团负责人运行多个合唱团的软件。
我正试图返回与特定合唱团相关的所有成员。因此,当合唱团团长选择特定的合唱团位置时,他们会看到与该位置相关联的所有成员。
我在MySQL数据库中有一个aauth_users表和一个choir_locations_to_users表。
aauth_users表保存有关每个合唱团成员的所有数据:
choir_locations_to_users表是一个单独的表,其中列出了用户ID和合唱团位置的ID。
我正在执行查询以获取显示所有成员所需的必要数据。例如成员名称,头像等将显示在“合唱团位置”页面上。
函数中的$ id参数是合唱团位置ID。
public function get_choirlocation_members($id) {
// $query = 'SELECT aauth_users.full_name, aauth_users.avatar, aauth_users.last_login, choir_location_to_users.location_id FROM aauth_users, choir_location_to_users WHERE aauth_users.id = choir_location_to_users.user_id ';
$this->db->select('aauth_users.full_name, aauth_users.avatar, aauth_users.last_login, aauth_users.id, choir_location_to_users.location_id');
$this->db->from('aauth_users, choir_location_to_users');
$this->db->where('aauth_users.id = choir_location_to_users.user_id');
$this->db->order_by('aauth_users.last_login', 'DESC');
$members = $this->db->get();
foreach ($members->result() as $row) {
if($row->location_id == $id){
return $members;
}
}
}
问题出在查询后的函数中,它似乎正在返回所有成员,而不只是返回与此位置相关的成员。就像我在查看文件中执行另一个foreach操作时,仍然看到所有成员一样。
foreach ($members->result() as $row): ?>
<li>
<img class="profile-user-img img-responsive img-circle" src="<?php echo BASE_URL.'uploads/user/'.$row->avatar ?>" alt="User Image">
<a class="users-list-name" href="#"><?php echo $row->full_name ?></a>
<span class="users-list-date">Last Login: <?php echo date ( "d.m.Y " , strtotime ($row->last_login )); ?></span>
</li>
<?php endforeach; ?>
我非常感谢您提供任何帮助,指出在尝试过滤查询结果以根据位置ID仅显示与特定合唱团位置相关联的成员时可能出错的地方。
@Dinesh Ali的更新Anwser在这里不起作用,这是我所拥有的:
我测试了您在phpMyAdmin中建议的新联接查询,结果如下:
您看到它在结果表中返回正确的数据,这很好,所以我添加了您建议的功能,如下所示:
public function get_choirlocation_members($id) {
$this->db->select('aauth_users.full_name, aauth_users.avatar, aauth_users.last_login, aauth_users.id, choir_location_to_users.location_id');
$this->db->from('aauth_users');
$this->db->join('choir_location_to_users', 'aauth_users.id = choir_location_to_users.user_id');
$this->db->where('aauth_users.id = choir_location_to_users.user_id');
$this->db->order_by('aauth_users.last_login', 'DESC');
$members = $this->db->get()->result();
if(isset($members) && count($members) > 0){
return $members;
}else{
return false;
}
}
然后在我的文件视图中,我使用以下内容将每个用户显示为LI列表项:
foreach ($members as $row): ?>
<li>
<img class="profile-user-img img-responsive img-circle" src="<?php echo BASE_URL.'uploads/user/'.$row->avatar ?>" alt="User Image">
<a class="users-list-name" href="<?php echo BASE_URL.'administrator/user/view/'.$row->id ?>"><?php echo $row->full_name ?></a>
<span class="users-list-date">Last Login: <?php echo date ( "d.m.Y " , strtotime ($row->last_login )); ?></span>
</li>
<?php endforeach; ?>
但是每个用户仍在显示我有3个用户,并且每个位置只有一个用户,因此我希望在视图中只看到一个结果?
答案 0 :(得分:1)
尝试一下
public function get_choirlocation_members($id) {
// $query = 'SELECT aauth_users.full_name, aauth_users.avatar, aauth_users.last_login, choir_location_to_users.location_id FROM aauth_users, choir_location_to_users WHERE aauth_users.id = choir_location_to_users.user_id ';
$this->db->select('aauth_users.full_name, aauth_users.avatar, aauth_users.last_login, aauth_users.id, choir_location_to_users.location_id');
$this->db->from('aauth_users');
$this->db->join('choir_location_to_users','aauth_users.id = choir_location_to_users.user_id','inner');
//$this->db->where('aauth_users.id = choir_location_to_users.user_id');
$this->db->order_by('aauth_users.last_login', 'DESC');
$members = $this->db->get();
foreach ($members->result() as $row) {
if ($row->location_id == $id) {
return $members;
}
}
}
答案 1 :(得分:1)
您无法以尝试的方式从两个表中获取数据。
您需要为此read more使用join()
public function get_choirlocation_members($id) {
$this->db->select('aauth_users.full_name, aauth_users.avatar, aauth_users.last_login, aauth_users.id, choir_location_to_users.location_id');
$this->db->from('aauth_users');
$this->db->join('choir_location_to_users', 'aauth_users.id = choir_location_to_users.user_id');
$this->db->where('aauth_users.id = choir_location_to_users.user_id');
$this->db->order_by('aauth_users.last_login', 'DESC');
$members = $this->db->get()->result();
在使用join()
时,无需检查带有循环和条件的位置,因为join()
正在为您完成这项工作
现在首先检查$members
是否为空
if(isset($members) && count($members) > 0){
return $members;
}else{
return false;
}
}