0

我在mysql中有两个表

用户:-id -name -email -role

位置-id-位置

我需要在 Codeigniter 中使用 PHPActiveRecord 构建一个搜索词。用户键入一个术语,例如“John”或“Designer”,我需要在用户和职位表中搜索它。我可以使用 like 运算符在 Users 表中搜索该术语,但无法弄清楚如何在 Positions 表中的 position 字段中进行搜索。

我用来在单个表中搜索的代码如下:

/**
 * 
 * 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;
}
4

1 回答 1

1

有多种方法可以执行此搜索。
http://www.phpactiverecord.org/projects/main/wiki/Finders#joins,它解释了你可以在查询中添加连接

  $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%");
于 2013-02-26T17:48:59.560 回答