2013-04-20 2 views
0

Во-первых я объясняю мой вопрос:Propel и Symfony: Join Table не работает

У меня есть две таблицы Работа и JobCategory:

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

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

Тхо две таблицы связано с помощью внешнего ключа «category_job_id».

В этом приложении я использую Propel ORM. Я надеялся сделать поиск, используя три поля: ключевые слова, имя_пользователя и имя категории.

Первое поле - это ключевые слова - «вход», для которых я могу написать ключевые слова, второе поле - это «имя категории», список категорий. Третье поле - это имя_задания и представляет собой «выбор», список имени задания, а если он не пуст, поля ключевых слов будут игнорироваться.

Я делаю функцию поиска, как это, но это не работает для меня:

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; 

} 

Но поиск во всех случаях это не так!

+0

Я не думаю, что это решение вашего вопроса, но в вашем посте есть несколько ошибок. Ваша таблица, скорее всего, будет 'job_category', а не' JobCategory' - последняя соответствует вашему классу модели. Я думаю, что 'categoty_name' должно быть' category_name' тоже. – halfer

+0

Посмотрите на Propel docs btw: есть метод toString (или аналогичный), который вы можете применить к '$ query', который даст вам SQL, который он сгенерировал. Это бесценно для отладки. – halfer

ответ

1

Я думаю, что-то вроде этого будет работать. Если нет, вы можете получить сгенерированный SQL перед выпуском find() (см. Ниже), чтобы вы (и мы) могли видеть, что может быть результатом.

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(); 
} 
+0

Большое спасибо jakerellla – Nll

+0

Несомненно, надеюсь, что это сработает для вас. – jakerella

+0

Да, после некоторых изменений он работает очень хорошо благодаря большому количеству, но у меня есть другая глупая проблема, если вы можете нам помочь ... – Nll

Смежные вопросы