搜索多个表php activerecord

时间:2013-02-23 08:44:32

标签: php mysql codeigniter phpactiverecord

我在mysql中有两个表

用户: -ID -名称 -电子邮件 -role

位置 -ID - 位

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

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

/**
 * 
 * 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 个答案:

答案 0 :(得分: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"
));

我认为至少应该让你走上正轨。

此外,当您以这种方式使用自定义条件时,您将使查询保持打开状态。 您必须使用查询占位符,否则您只是将原始输入放入查询中。

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%");