Получение сообщения: указан неверный аргумент для foreach (), когда в таблице нет записей - PullRequest
0 голосов
/ 21 февраля 2019

У меня есть две таблицы с записями.В первой таблице я отображаю личную информацию, а во второй таблице я добавляю подробности действий.

Теперь я пытаюсь отобразить запись с помощью объединений.Ниже приведен код, который я использую в модели

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;  
    }

  }

Контроллер

Примечание: здесь я получаю несколько идентификаторов, потому что у меня есть еще несколькологика.Вот почему я использую их для каждого.

$ActivityData=[];
foreach ($data['getAllMember'] as $key => $m_id) {
$ActivityData[] = $this->Access_model->getMemberActivity($m_id->member_id);
   }
$data['MemberActivity'] = $ActivityData;

Теперь, если я обнаружил записи, связанные с идентификатором члена во вторичной таблице, то я получаю вывод, но если не нашел запись во второйто я получаю сообщение об ошибке 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";}

Итак, мой ожидаемый результат - я должен отобразить записи, если они найдены вВторая таблица, если она не найдена, также отображает записи таблицы участников.

Не могли бы вы помочь мне в этом?

Ответы [ 3 ]

0 голосов
/ 21 февраля 2019

Переместите ваше условие "где" '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;
0 голосов
/ 21 февраля 2019

Проблема с функцией вашей модели 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.

0 голосов
/ 21 февраля 2019

Надеюсь, это вам поможет, попробуйте

foreach ($SActivity as $sec_1) {
    if (!empty($sec_1)):
        foreach ($sec_1 as $sec_activities) {
            //list here
            print_r($sec_activities);  
        }
    endif;
}
...