【问题标题】:How to group 'like' with Codeigniter active records?如何将“喜欢”与 Codeigniter 活动记录分组?
【发布时间】:2014-09-02 15:50:08
【问题描述】:

我正在构建一个包含多个选项的搜索表单。我们的想法是寻找具有某些特征的人,例如职业、上一份公司工作的名称、多年经验等。

在表格的第一部分,您可以输入您希望候选人拥有的职业,在第二部分,您可以输入一个或多个公司名称。我想要的是我的查询看起来像这样:

SELECT *
FROM work_experience
WHERE position = 'some position'
AND (company LIKE 'company 1' OR company LIKE 'company 2', etc)

问题是我不知道用户可能输入的许多公司名称,我所做的是将每个名称存储在一个我不知道它可能有多大的数组中。

我尝试使用 or_like() 活动记录,但问题是它寻找的人是 'positionx' 或在 'company x' 工作的人,这不是我想要的结果。

有没有办法使用活动记录进行此查询?或者,如果我不知道要搜索的公司名称的确切数量,我该如何使用简单的 SQL 进行查询。

感谢您的宝贵时间和帮助,如果有不清楚的地方请告诉我。

【问题讨论】:

  • 如果您必须检查多个值,为什么不使用 where_in。如果您需要更多信息,请告诉我。
  • 我需要更多信息 :( 如何使用 where_in?
  • @Zeeshan 刚刚阅读了文档, where_in 听起来不错,但问题是用户不会在存储时输入准确的公司名称。例如,候选人可能已将“google”存储为公司,并且用户搜索“Google”。这就是我使用“喜欢”的原因。
  • 如果您采用与您的示例类似的公司名称, where_in 将起作用,但如果您想检查类似的内容:搜索了 goog,那么如果 google 是开始于的公司,则应该使用 google这样的顺序。重要的是您如何在搜索表单中获取详细信息。我建议您不要通过输入文本进行输入,而是通过复选框进行输入,因为这将使您的生活更轻松,并且您也会很好地练习。

标签: php mysql sql codeigniter


【解决方案1】:

尝试使用此序列

控制器代码

$getcompanyList=$this->input->post('company'); //post variable company from view
$data['companyList']=explode(',', $getcompanyList);
//Query for model
$getResult=$this->myModel->somefunction($data);

型号代码

function somefunction($data){
$this->db->select('*');
$this->db->where('position','some position');
$this->db->where_in('company',$data['companyList']);
//or $this->db->or_where_in('company',$data['companyList']);
$getResult=$this->db->get('work_experience');
}

现在,如果您没有得到想要的结果,那么只需使用 $this->db->last_query() 打印最后一个查询,或者对您的应用程序进行分析并检查正在生成的 sql。

【讨论】:

  • 如何循环 or_like?我不知道到底会有多少家公司。
  • 用户在表格中键入他正在寻找的公司,用逗号分隔。然后我将每个公司存储在一个数组中。然后我在数据库中查找用户输入的公司。
  • 好的..所以你在文本框中获取公司列表(最好通过逗号[,]之类的分隔符分隔)然后将其作为 $this->input->post('company') 和然后分解并将其转换为数组并在模型中使用 where_in 子句($this->db->where_in('company',$companyArray))
  • @k10gaurav 你到底在说什么?
  • @ParagTyagi 用户在视图中用逗号分隔的文本框中输入了公司名称,现在当涉及到控制器时,它已被转换为数组,数组已传递给模型进行检查。
【解决方案2】:

应该是这样的-


查看:

<form action="/career/search/" method="POST">
      Position: <input type="text" name="position" />
      Company1: <input type="text" name="company[]" />
      Company2: <input type="text" name="company[]" />
      Company3: <input type="text" name="company[]" />
      ...
      ...
      CompanyN: <input type="text" name="company[]" />
</form>


控制器:

class Career extends CI_Controller
{
    public function __construct()
    {
        parent::__construct();
    }

    public function search()
    {
       $this->career_model->search_career($this->input->post());
    }
}


(A) 模型(使用 where_in):

class Career_model extends CI_Model
{
    public function __construct()
    {
        parent::__construct();
    }

    public function search_career($data)
    {
        $this->db->select('*');
        $this->db->where('position', $data['position']);
        $this->db->where_in('company', $data['company']);
        $query = $this->db->get('work_experience');

        echo "<pre>"; print_r($query->result());   // Result           
    }
}


(B) 模型(使用 or_like):

class Career_model extends CI_Model
{
    public function __construct()
    {
        parent::__construct();
    }

    public function search_career($data)
    {
        $this->db->select('*');
        $this->db->where('position', $data['position']);

        foreach($data['company'] as $company)
        {
            $this->db->or_like('company', $company);
        }
        $query = $this->db->get('work_experience');

        echo "<pre>"; print_r($query->result());   // Result           
    }
}


编辑:

foreach($data['company'] as $company)
{
    $wh[] = "`company` LIKE '".$company."'";
}
$where = "(".implode("or", $wh).")";
$this->db->where($where, NULL, FALSE);

【讨论】:

  • 是的,这是一个很好的解决方案,问题是用户输入的公司名称可能与数据库中存储的不同。例如,如果某人将她的最后一个公司名称存储为“google inc”并且用户键入“Google”,则它不会显示。这就是我使用“喜欢”的原因。
  • 检查编辑。它有点hacky,但应该工作。用编辑替换foreach loop
  • 一个小问题,因为在 WHERE 子句中使用 NULL 和 FALSE,它会告诉 CI 不要保护该字段。这对 SQL 注入或其他漏洞开放吗?
  • 很高兴你问到。如果您使用活动记录,则不必担心 SQL 注入,因为 codeigniter auto escapes 的值。所以你的问题的答案是否定的。
  • 在此处阅读注释(红色框内):ellislab.com/codeigniter/user-guide/database/active_record.html。就在标题下方$this-&gt;db-&gt;where();
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-04-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-16
  • 2014-02-22
相关资源
最近更新 更多