0

まず、私の問題を説明します。

Job と JobCategory の 2 つのテーブルがあります。

job:
   -------------------------------------------------
   | id   | category_job_id | job_name  | keywords  |
   -------------------------------------------------

JobCategory: 
  -------------------------
  | id   | categoty_name  |
  -------------------------

2 つのテーブルは、外部キー「category_job_id」によって関連付けられています。

このアプリケーションでは、Propel ORM を使用しています。job_name と category_name の 3 つのフィールド キーワードを使用して検索したいと考えました。

最初のフィールドはキーワードで、キーワードを入力できる「input」、2 番目のフィールドは Category_name が「選択」、カテゴリのリストです。3 番目のフィールドは Job_name で、ジョブ名の「選択」リストです。空でない場合、キーワード フィールドは無視されます。

私はこのような検索機能を作っていますが、うまくいきません:

  public function searchFilter($job,$category,$keyword)
   {

$order = isset($this->order) ? $this->order : Criteria::ASC;

$job = '%' .$job. '%';
$category = '%' .$category. '%';

$c = new Criteria();

$c->addJoin(JobPeer::CATEGORY_JOB_ID, JobCategoryPeer::ID);
if((null !== $category) AND ($category !== ""))
{
 $c->addOr(JobCategoryPeer::CATEGORY_NAME,$category, Criteria::LIKE);    
}
if((null !== $job) AND ($job !== ""))
{
 $c->addOr(JobPeer::JOB_NAME,$job, Criteria::LIKE);   
}

$query = JobQuery::create(null, $c)
        ->joinWith('Job.JobCategory')
        ->orderByDateOfJob($order);

  if((null !== $keyword) AND ($keyword !== "")){
    $keyword = '%' .$keyword. '%';
    $query->filterByKeywords($keyword, Criteria::LIKE);
  }      

$results = $query->find();


return $results;

}

しかし、検索はすべてのケースが間違っています!

4

1 に答える 1

1

このようなものがうまくいくと思います。そうでない場合は、find()(以下を参照) を発行する前に生成された SQL を取得して、出力がどうなるかを確認できます。

public function searchFilter($job,$category,$keyword)
{

  $order = isset($this->order) ? $this->order : Criteria::ASC;

  $query = JobQuery::create()->joinWith('JobCategory');
  $conditions = array();

  if((null !== $category) AND ($category !== ""))
  {
    $query->condition('catName', "JobCategory.CategoryName LIKE ?", "%$category%");
    $conditions[] = 'catName';
  }
  if((null !== $job) AND ($job !== ""))
  {
    $query->condition('jobName', "Job.JobName LIKE ?", "%$job%");
    $conditions[] = 'jobName';
  }
  if (sizeOf($conditions) > 1)
  {
     // join your conditions with an "or" if there are multiple
    $query->combine($conditions, Criteria::LOGICAL_OR, 'allConditions');
    // redefine this so we have the combined conditions
    $conditions = array('allConditions');
  }

  // add all conditions to query (might only be 1)
  $query->where($conditions);

  if((null !== $keyword) AND ($keyword !== ""))
  {
    $query->filterByKeywords("%$keyword%", Criteria::LIKE);
  }

  $query->orderByDateOfJob($order);
  $sql = $query->toString(); // log this value so we can see the SQL if there is a problem
  return $query->find();
}
于 2013-04-21T17:42:36.870 に答える