搜索多个表php活动记录


Search multiple tables php activerecord

我在mysql 中有两个表

用户:-id-名称-电子邮件-角色

职位-id-位置

我需要使用Codeigniter中的PHPActiveRecord构建一个搜索词。用户键入一个术语,比如"John"或"Designer",我需要在users和postions表中搜索它。我可以使用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;
}

执行此搜索有多种方法
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%");