我有两个带有记录的表。在第一个表中,我正在显示个人信息,在第二个表中,我正在添加活动详细信息。
现在,我正在尝试使用联接显示记录。所以下面的代码,我在模型中使用
public function getMemberActivity($gotMemberId){
$getDetails = array('members.member_id'=>$gotMemberId,'member_activity.activity_status'=>1,'members.is_Approved'=>1);
$result = $this->db->where($getDetails)
->from('members')
->join('member_activity', 'members.member_id = member_activity.member_id','LEFT')
->get()
->result();
//echo $this->db->last_query();
//print_r($result);
if($result)
{
return $result;
}
else
{
return 0;
}
}
控制器
注意:我在这里得到多个成员ID,因为上面有更多逻辑。这就是我为每个人使用的原因。
$ActivityData=[];
foreach ($data['getAllMember'] as $key => $m_id) {
$ActivityData[] = $this->Access_model->getMemberActivity($m_id->member_id);
}
$data['MemberActivity'] = $ActivityData;
现在,如果我在辅助表中找到与成员ID相关的记录,那么我将得到输出,但如果在第二个表中未找到记录,那么我将得到错误Message: Invalid argument supplied for foreach()
如果我从'member_activity.activity_status'=>1
子句中删除了where
,则我的联接查询正在运行。我的意思是我正在获取会员记录。
->join('member_activity', 'members.member_id = member_activity.member_id','LEFT')
查看
$SActivity=$MemberActivity;
//print_r($SActivity);
if($SActivity){
foreach ($SActivity as $sec_1) {
foreach ($sec_1 as $sec_activities) {
//list here
}
}
}
else{echo"no data availalbe";}
所以我的预期输出是,如果没有找到第二张表,我必须显示记录,然后显示成员表记录。
您能帮我吗?
答案 0 :(得分:2)
按如下所示在'member_activity.activity_status'=>1
中移动您的条件JOIN
,
$public function getMemberActivity($gotMemberId){
$getDetails = array('members.member_id'=>$gotMemberId,'members.is_Approved'=>1);
$result = $this->db->where($getDetails)
->from('members')
->join('member_activity', 'members.member_id = member_activity.member_id AND member_activity.activity_status = 1','LEFT')
->get()
->result();
//echo $this->db->last_query();
//print_r($result);
if($result)
{
return $result;
}
else
{
return 0;
}
}
希望这会对您有所帮助。
最终查询如下:
SELECT members.*,member_activity.* FROM members LEFT JOIN member_activity ON members.member_id = member_activity.member_id AND member_activity.activity_status = 1
WHERE 'members.member_id' = $gotMemberId AND 'members.is_Approved' = 1;
答案 1 :(得分:1)
问题出在您的模型函数getMemberActivity
上。如果没有记录,那么您将返回0
,而当您foreach
时,将得到错误,因为它不是数组。因此您可以简单地返回$result
,因为codeigniter返回默认数组。
public function getMemberActivity($gotMemberId)
{
$getDetails = array('members.member_id' => $gotMemberId, 'members.is_Approved' => 1);
$result = $this->db->where($getDetails)
->from('members')
->join('member_activity', 'members.member_id = member_activity.member_id AND member_activity.activity_status = 1', 'LEFT')
->get()
->result();
return $result;
}
第二个选项是您可以在!empty
之前检查foreach
。
答案 2 :(得分:0)
希望这对您有所帮助
foreach ($SActivity as $sec_1) {
if (!empty($sec_1)):
foreach ($sec_1 as $sec_activities) {
//list here
print_r($sec_activities);
}
endif;
}