2013-02-23 53 views
0

我在mysql中的兩個表搜索多個表的PHP的ActiveRecord

用戶: -id -name -email -role

位置 -id - 位

我需要在Codeigniter中使用PHPActiveRecord建立一個搜索詞。 用戶鍵入一個術語'約翰'或'設計師',我需要在用戶以及位置表中搜索它。 我可以使用like運算符在Users表中搜索術語,但無法弄清楚如何在位置表中搜索位置字段。

的代碼,我使用一個表來搜索如下:

/** 
* 
* Search users based on parameters 
* @param integer $limit 
* @param integer $start 
* @param string $term 
*/ 
public function search_candidates($limit, $start, $term, $role) 
{ 
    $candidates = User::all(array(
           'conditions' => "('role' => $role) 
            AND ((name like '%".$term."%') 
            OR (email like '%".$term."%'))", 
           'limit' => $limit, 
           'offset' => $start, 
           'order' => "name" 
)); 

    return $candidates; 
} 

回答

1

有多種方式來執行此搜索。
http://www.phpactiverecord.org/projects/main/wiki/Finders#joins,這也解釋了htat您可以添加連接來查詢

$candidates = User::all(array(
          'joins'=>'LEFT JOIN position on (normal left join stuff) 
          'conditions' => "('role' => $role) 
           AND ((name like '%".$term."%') 
           OR (email like '%".$term."%'))", 
           //(Your extra where conditions for the position) 
          'limit' => $limit, 
          'offset' => $start, 
          'order' => "name" 
)); 

我認爲至少應該讓你在正確的軌道上。

另外,當您以這種方式使用自定義條件時,您將使您的查詢開放給SQL注入。 您必須使用查詢佔位符,否則您只是將原始輸入放入查詢中。

User::find($id)會自動轉義。

User::all(array('conditions'=>'id'=>1))自動逃脫

User::all(array('conditions'=>"id = $id"))沒有逃脫。

你要做User::find(array('conditions'=>'id = ?', array($id)));

您的查詢將被轉換成這個樣子。

$candidates = User::all(array(
          'conditions' => "('role' = ?) 
           AND ((name like ?) 
           OR (email like ?))", 
          'limit' => $limit, 
          'offset' => $start, 
          'order' => "name" 
),array($role,"%$term%","%$term%");