Как вызвать функцию внутри контроллера внутри цикла foreach со значением разных параметров

#php #oop #laravel-4

#php #ооп #laravel-4

Вопрос:

я пытаюсь повторно вызвать пользовательскую функцию m с одинаковым или разными значениями параметров внутри параметров цикла foreach в зависимости от значения ключа, предоставленного моим foreach.

 foreach ($result as $r) {

            if($r->marks1==null || $r->marks2==null)
            {
                echo $r->p_code;
                $toUpdate=$this->getResult($username,$r->p_code);
                print_r($toUpdate);
            }
        }
  

но когда я печатаю последний результат запроса, я получаю $ toUpdate, добавляемый к последнему запросу параметра.

 Array
(
    [query] => select * from `result` where (`studentid` = ?) and `studentid` = ? and `ccode` = ? and `a_no` = ? order by `date` desc limit 1
    [bindings] => Array
        (
            [0] => XYZ
            [1] => XYZ
            [2] => course123code
            [3] => 12321
        )

    [time] => 0.18
)
  

мое имя пользователя становится таким же, в то время как код курса переопределяет get при поиске второго результата.

я хочу получить результат getResult() внутри цикла foreach, чтобы он мог выдавать соответствующий результат для разных значений параметров.

 public function getLatestResult($username,$course_code)
{

    $user=new User;
    $currentDetailOfUser=$this->userCurrentDetail($username);

        $userdetail=json_decode($currentDetailOfUser,true);
            $username        =$userdetail['username'];
            $studentid       =$userdetail['userid'];
            $studentBatch    =$userdetail['batch'];
            $programCode     =$userdetail['programCode'];
            $activeSemester  =$userdetail['activesemester'];

        $condition_key=array(
            'studentid' =>$studentid
            );


       $getCurrentResult1 =$user->getDetail('student_result',$condition_key);
       $getCurrentResult2 =$user->getDetail('student_result',$condition_key);
       $resultAssessment1=$getCurrentResult1->where('studentid',$studentid)->where('course_code',$course_code)->where('assignment_no',1)->orderBy('date','Desc')->limit(1)->get();
       $resultAssessment2=$getCurrentResult2->where('studentid',$studentid)->where('course_code',$course_code)->where('assignment_no',2)->orderBy('date','Desc')->limit(1)->get();
       $recentResult=array_merge($resultAssessment1,$resultAssessment2);
        return $recentResult;


}
  

Ответ №1:

Это плохая практика, если вы извлекаете данные db изнутри foreach loop .

Кстати, вы можете сделать это, сохранив все новые результаты в том же массиве, проиндексировав его некоторым уникальным значением, это будет выглядеть следующим образом-

 $toUpdate=array();

foreach ($result as $r) {

                if($r->marks1==null || $r->marks2==null)
                {
                    echo $r->p_code;
                    $toUpdate[$r->p_code]=$this->getResult($username,$r->p_code); // added $r->p_code as index to Array - $toUpdate

                }
            }
    print_r($toUpdate); // this will give all the related result according your parameters
  

[ОБНОВИТЬ]

Попробуйте использовать unset($yourarray) для вашего следующего запроса, этот массив будет новым, и они присваивают новое значение каждый раз —

 public function getLatestResult($username,$course_code)
{

    $user=new User;
    $currentDetailOfUser=$this->userCurrentDetail($username);

        $userdetail=json_decode($currentDetailOfUser,true);
            $username        =$userdetail['username'];
            $studentid       =$userdetail['userid'];
            $studentBatch    =$userdetail['batch'];
            $programCode     =$userdetail['programCode'];
            $activeSemester  =$userdetail['activesemester'];

        $condition_key=array(
            'studentid' =>$studentid
            );


       $getCurrentResult1 =$user->getDetail('student_result',$condition_key);
       $getCurrentResult2 =$user->getDetail('student_result',$condition_key);
       $resultAssessment1=$getCurrentResult1->where('studentid',$studentid)->where('course_code',$course_code)->where('assignment_no',1)->orderBy('date','Desc')->limit(1)->get();
       $resultAssessment2=$getCurrentResult2->where('studentid',$studentid)->where('course_code',$course_code)->where('assignment_no',2)->orderBy('date','Desc')->limit(1)->get();


        unset($currentDetailOfUser);
        unset($userdetail);
        unset($condition_key);
        unset($recentResult);

        $recentResult=array_merge($resultAssessment1,$resultAssessment2);
        return $recentResult;

}
  

Надеюсь, это может вам помочь.

Комментарии:

1. Да, вы правы, что это плохая практика, но, несмотря на то, что мне это нужно, просто посмотрите запрос mysql, который я опубликовал в своем вопросе Student_id добавляется при перезаписи p_code, это потому, что я ищу diff p_code для того же пользователя?

2. можете ли вы также опубликовать свой getResult код? поэтому было бы неплохо проверить все, прежде чем переходить к любому другому решению.

3. @user3345331 — Не могли бы вы рассказать, пожалуйста, в чем разница между ними: $getCurrentResult1=$user->getDetail('student_result',$condition_key); $getCurrentResult2=$user->getDetail('student_result',$condition_key); . То же самое $condition_key' и $studentid . Я почему вы получаете два раза один и тот же результат, и вы также объединили их, почему? Это может быть проблемой.

4. поступая таким образом, я пытаюсь получить данные, хранящиеся в двух строках таблицы, и вернуть их в одном массиве

5. Вы можете получить все строки одним запросом из базы данных, если одно условие совпадает в нескольких строках. Вы пытались напечатать `$getCurrentResult1′. я уверен, что это выдаст обе строки в рамках одного запроса. Или я сбился с пути.