MySQL запрос для проверки наличия поля в массиве в codeigniter - PullRequest
1 голос
/ 26 сентября 2019

Я публикую массив навыков из формы, и мне нужно получить список кандидатов, связанных с элементами массива в codeigniter.

Контроллер

  $data = array(
        "mode"          => $this->input->post("mode"),
        "designation"   => $this->input->post("designation"),
        "notice_period" => $this->input->post("notice_period"),
        "skill"         => $this->input->post("skills"),
        "cities"        => $this->input->post("city")
    );

    $this->load->model("search_model");
    $this->load->model("candidate_model");
    $data["candidate"] = $this->search_model->fetch_candidate($data);
    $data["designation"] = $this->candidate_model->fetch_designation();
    $this->load->view('candidate_profiles', $data);

модель

function fetch_candidate($data)
{
    $mode = $data['mode'];
    $designation = $data['designation'];
    $notice_period = $data['notice_period'];
    $skill = $data['skill'];
    $skills = join(",",$skill);
    $city = $data['cities'];
    $query = $this->db->query("SELECT DISTINCT(U.user_id), U.firstname, U.lastname, U.username, U.usertype, U.email, U.phone, U.address, U.profile_image, C.name AS country,C.id AS countryid, S.name AS state,S.id AS stateid, A.housename, A.street, A.area, A.po, A.city, CJ.designation, CJ.resume, CJ.biography, CJ.hiring_mode, CJ.notice_period, CJ.current_CTC, CJ.expected_CTC, D.designation_id AS desig, D.designation AS desig_name
   FROM users AS U
   LEFT JOIN address AS A ON U.user_id=A.cand_id
   LEFT JOIN cand_job_details AS CJ ON CJ.cand_id=U.user_id
   LEFT JOIN designations AS D ON D.designation_id=CJ.designation
   LEFT JOIN countries AS C ON C.id=A.country
   LEFT JOIN states AS S ON S.id=A.state
   LEFT JOIN user_skills AS US ON U.user_id=US.user_id
   LEFT JOIN user_interested_cities AS UC ON U.user_id=UC.user_id
   WHERE D.designation LIKE '$designation' && (CJ.hiring_mode='2' || CJ.hiring_mode='$mode')  && CJ
   .notice_period<='$notice_period' && UC.city='$city' && US.skill IN(".implode(",", $skills).")
   ");
    return $query;
}

Как реализовать это на codeigniter?Заранее спасибо

Ответы [ 2 ]

2 голосов
/ 26 сентября 2019

Вам нужно попытаться добавить ' вокруг каждого аргумента.После он должен выглядеть как IN ('PHP','AngularJS'), потому что это строковое значение и тип данных также varchar.

$skills = "'";
foreach($skill as $item) {
            $skills .= $item."',";
}
$skills = trim($skills,",")
1 голос
/ 26 сентября 2019

Codeigniter поставляется со встроенным в Querybuilder - я настоятельно рекомендую использовать его, потому что он делает вашу жизнь намного проще и защищает вас от SQL-инъекций - что, несомненно, является проблемой в вашем случае.

Попробуйтеследующий

function fetch_candidate($data)
{
    $this->db
        ->select('SELECT DISTINCT(U.user_id), U.firstname, U.lastname, U.username, U.usertype, U.email, U.phone, U.address, U.profile_image, C.name AS country,C.id AS countryid, S.name AS state,S.id AS stateid, A.housename, A.street, A.area, A.po, A.city, CJ.designation, CJ.resume, CJ.biography, CJ.hiring_mode, CJ.notice_period, CJ.current_CTC, CJ.expected_CTC, D.designation_id AS desig, D.designation AS desig_name')
        ->from('users U')
        ->join('address A', 'U.user_id=A.cand_id', 'left')
        ->join('cand_job_details CJ', 'CJ.cand_id=U.user_id', 'left')
        ->join('designations D', 'D.designation_id=CJ.designation', 'left')
        ->join('countries C', 'C.id=A.country', 'left')
        ->join('states S', 'S.id=A.state', 'left')
        ->join('user_skills US', 'U.user_id=US.user_id', 'left')
        ->join('user_interested_cities UC', 'U.user_id=UC.user_id', 'left');

    if (isset($data['designation']) && !empty($data['designation']))
    {
        $this->db->like('D.designation', $data['designation']);
    }   

    if (isset($data['mode']) && !empty($data['mode']))
    {
        $this->db
            ->group_start()
                ->where('CJ.hiring_mode', 2)
                ->or_where('CJ.hiring_mode', $data['mode'])
            ->group_end();
    }

    if (isset($data['notice_period']) && !empty($data['notice_period']))
    {
        $this->db->where('CJ.notice_period <=', $data['notice_period']);
    }

    if (isset($data['city']) && !empty($data['city']))
    {
        $this->db->where('UC.city', $data['city']);
    }

    if (isset($data['skills']) && is_array($data['skills']))
    {
        $this->db->where_in('US.skill',  $data['skills']);
    }

    return $this->db->get();
}   
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...