2

私はcondeigniter(初心者)のプロジェクトに取り組んでいます。私のプロジェクトには、カテゴリ、サブカテゴリ、キーワード、最小値と最大値などのさまざまなフィルターを使用した製品のリストが含まれています。カスタム php でこれを何百回も実行し、句$whereのすべての条件を変数にしました。where例えば

$where = '';
if($category != '')
{
  $where .= " category = '$category'";
}

現在、codeigniter には複数のパラメーターがあり、それらをcontrollerスルーuri segmentして呼び出しmodel関数で取得し、すべてのパラメーターをrun mysql queryそこに渡すことができます。問題は、すべてのパラメーターが空または設定されているかどうかをチェックし、それに応じて複数のクエリを実行していることです。例えば。

if($category != '' && $subCategory != '')
{
  //whole query here
}
else  if($category == '' && $subCategory != '')
{
  //whole query here
}

//and so on

結合(複数のパラメーター)があるため、これを行うための最適化方法が必要です。

私のサンプル条件とクエリ

if($subCat == '' && $vendor == '')
    {
        $cat = str_replace("-"," ",str_replace("-and-"," & ",$cat));
        $this->db->select('listings.* ');
        $this->db->from('listings');
        $this->db->join('categories','categories.id = listings.category');
        $this->db->where('categories.name',$cat);
        $this->db->limit($perpage,$page);
        $query = $this->db->get();
        return $query->result();
    }
    else if($subCat == '' && $vendor != '')
    {
        $cat = str_replace("-"," ",str_replace("-and-"," & ",$cat));
        $this->db->select('listings.* ');
        $this->db->from('listings');
        $this->db->join('categories','categories.id = listings.category');
        $this->db->join('vendors','vendors.id = listings.programme');
        $this->db->where('categories.name',$cat);
        $this->db->where('vendors.name',$vendor);
        $this->db->limit($perpage,$page);
        $query = $this->db->get();
        return $query->result();
    }
    else if($subCat != '' && $vendor == '')
    {
        $cat = str_replace("-"," ",str_replace("-and-"," & ",$cat));
        $this->db->select('listings.* ');
        $this->db->from('listings');
        $this->db->join('categories','categories.id = listings.category');
        $this->db->join('subcategories','subcategories.id = listings.subcategory');
        $this->db->where('categories.name',$cat);
        $this->db->where('subcategories.name',$subCat);
        $this->db->limit($perpage,$page);
        $query = $this->db->get();
        return $query->result();
    }
    else
    {
        $cat = str_replace("-"," ",str_replace("-and-"," & ",$cat));
        $subCat = str_replace("-"," ",str_replace("-and-"," & ",$subCat));
        $vendor = str_replace("-"," ",str_replace("-and-"," & ",$vendor));

        $this->db->select('listings.* ');
        $this->db->from('listings');
        $this->db->join('categories','categories.id = listings.category');
        $this->db->join('subcategories','subcategories.id = listings.subcategory');
        $this->db->join('vendors','vendors.id = listings.programme');
        $this->db->where('categories.name',$cat);
        $this->db->where('subcategories.name',$subCat);
        $this->db->where('vendors.name',$vendor);
        $this->db->limit($perpage,$page);
        $query = $this->db->get();  
        return $query->result();
    }
4

2 に答える 2

2

毎回ではなく、一度だけクエリを記述する必要があります。たとえば、あなたが説明したように、いくつかの条件があるかもしれません。たとえば、ここに私がやったことがあります:

$this->db->select('resource.id,city.name as city_name,city.provinceID,resource.Rate, skills.name')->from('resource')
->join('city','resource.cityID = city.id')
->join('resourceToSkillsMap','resource.id = resourceToSkillsMap.resourceID')
->join('skills','skills.id =  resourceToSkillsMap.skillsID');

if($category != '' && $subCategory != '') #condition
{
    $this->db->where('condition');
}
else  if($category == '' && $subCategory != '') #condition
{
    $this->db->where('condition');
}

$rs = $this->db->group_by('resource.id')
->limit($limit,$offset)
->get();

クエリがどのように記述されているかを確認しonly oncewhere conditionくださいif else。SOあなたのクエリはそのように構築されます。クエリが実行された後、クエリecho $this->db->last_query();をエコーし​​、必要に応じて調整します。

于 2013-09-17T07:10:18.393 に答える
1

$where array()ヘルパーでは、このように構築できます

$where = array();
if($category != '')
{
   $where['category'] = $category;
} else {
   $where['someotherkey'] = 'someothervalue';
}

コントローラーでは$where、モデルを呼び出すときに配列を渡すだけです。

$this->foo_model->foo_method($where);

そしてモデルでは、このようなことができます

$this->db->where($where);

編集

if($category != '')
{
   //Along with your $this->db->where()
   $this->db->join('table1','condition1');
} else {
   //Along with your $this->db->where()
   $this->db->join('table2','condition2');
}

物事を整理する

$cat = str_replace("-"," ",str_replace("-and-"," & ",$cat));
$this->db->select('listings.* ');
$this->db->from('listings');
$this->db->join('categories','categories.id = listings.category');  
$this->db->where('categories.name',$cat);

if($vendor != '')      {
  $this->db->join('vendors','vendors.id = listings.programme');
  $this->db->where('vendors.name',$vendor);
}
if($subCat != ''){
  $subCat = str_replace("-"," ",str_replace("-and-"," & ",$subCat));
  $this->db->join('subcategories','subcategories.id = listings.subcategory');
  $this->db->where('subcategories.name',$subCat);
}    

$this->db->limit($perpage,$page);
$query = $this->db->get();
return $query->result();
于 2013-09-17T07:05:10.610 に答える