Я пытаюсь запустить следующий запрос в CodeIgniter, но он не возвращает правильный вывод. Согласно запросу, одним из условий является то, что если значение $ vend_id не сопоставляется, результат не должен отображаться. Тем не менее, он отображает весь результат независимо от того, что такое значение параметра vend_id. Кто-нибудь может помочь мне в исправлении этого запроса
public function get_onboarded_detail()
{
$supplier_id = 40;
$query = $this->db->select('*')
->from('job')
->join('job_workforce', 'job_workforce.job_id = job.id', 'Right')
->where('job_workforce.supplier_id',$supplier_id)
->where('job_workforce.status','onboarded')
->or_where('job_workforce.status','job_offer')
->or_where('job_workforce.status','offer_accepted_by_client')
->or_where('job_workforce.status','offer_accepted_by_supplier')
->get();
$res = $query->result();
}
Фактическая проблема с вашим состоянием, потому что в нем содержится условие "ИЛИ", поэтому независимо от того, что ваша система vend_id вернет истинный результат. см. ниже пример:
Ваш текущий, где условие: -
WHERE job_workforce.supplier_id = 40 AND job_workforce.status = 'onboarded' OR job_workforce.status = 'job_offer' OR job_workforce.status = 'offer_accepted_by_client' OR job_workforce.status = 'offer_accepted_by_supplier'
Так должно быть:-
WHERE job_workforce.supplier_id = 40 AND (job_workforce.status = 'onboarded' OR job_workforce.status = 'job_offer' OR job_workforce.status = 'offer_accepted_by_client' OR job_workforce.status = 'offer_accepted_by_supplier')
Чтобы сделать коррекцию с помощью codeigniter, используйте:
public function get_onboarded_detail()
{
$supplier_id = 40;
$query = $this->db->select('*')
->from('job')
->join('job_workforce', 'job_workforce.job_id = job.id', 'Right')
->where("job_workforce.supplier_id = $supplier_id AND (job_workforce.status = 'onboarded' OR job_workforce.status = 'job_offer' OR job_workforce.status = 'offer_accepted_by_client' OR job_workforce.status = 'offer_accepted_by_supplier')");
->get();
$res = $query->result();
}
WHERE jw.supplier_id = 40 AND jw.status IN ('onboarded','job_offer','offer_accepted_by_client','offer_accepted_by_supplier')
Таким образом, вы можете использовать группировку кодовое слово где условия. Вы можете создавать группы соответственно.
public function get_onboarded_detail() {
$supplier_id = 40;
$query = $this->db->select('*')
->from('job')
->join('job_workforce', 'job_workforce.job_id = job.id', 'Right')
->group_start()
->where('job_workforce.supplier_id',$supplier_id)
->where('job_workforce.status','onboarded')
->group_end()
->group_start()
->or_where('job_workforce.status','job_offer')
->or_where('job_workforce.status','offer_accepted_by_client')
->or_where('job_workforce.status','offer_accepted_by_supplier')
->group_end()
->get();
$res = $query->result();
}
Согласно запросу, одним из условий является то, что если значение $ vend_id не сопоставляется, результат не должен отображаться. Тем не менее, он отображает весь результат независимо от того, что такое значение параметра vend_id.
Если вы используете OR между условиями, даже если какое-либо условие истинно, оно вернет выход. Используйте И, если вы хотите отфильтровать свой результат со всеми предоставленными условиями.
echo $this->db->last_query();
exit();
перед$res = $query->result();
job
RIGHT JOINjob_workforce
ONjob_workforce
.job_id
=job
.id
ГДЕjob_workforce
.supplier_id
= 40 Иjob_workforce
.status
= 'onboarded' ИЛИjob_workforce
.status
= 'job_offer' ИЛИjob_workforce
.status
= 'offer_accepted_by_client' ИЛИjob_workforce
.status
= 'offer_accepted_by_supplier'