如何根据Eloquent中的过滤器从DB中正确选择数据?

时间:2015-06-14 16:26:02

标签: php mysql laravel eloquent

我有一个过滤器。

过滤器包含三个字段。 Call_Date_FromCall_Date_TillTelephone

所以我需要从LEADS(主要模型)表中选择适合过滤器的所有行。

在原始的Php + MySQL中我会写这样的东西:

$sql = ' WHERE ';
$post['call_date_from'] ? $sql .= ' `call_date` >= ' . $post['call_date_from'];
$post['call_date_till'] ? $sql .= ' AND `call_date` <= ' . $post['call_date_till'];
$post['telephone'] ? $sql .= ' AND `telephone` LIKE %' . $post['telephone'] . '%';

mysql: 'SELECT * FROM LEADS' . $sql;

那么在Laravel Eloquent中如何做到这一点呢?

1 个答案:

答案 0 :(得分:0)

这是使用Query Scope在Laravel Eloquent中进行过滤的方法。

在模型中

class Lead extends Model
{
    public function scopeCallDateFrom($query, $date)
    {
        if ($date) {
            return $query->where("call_date", ">=", $date);
        } else{
          return $query;  
        } 
    }

    public function scopeCallDateTill($query, $date)
    {
        if ($date) {
            return $query->where("call_date", "<=", $date);
        } else{
          return $query;  
        } 
    }

    public function scopeTelephone($query, $telephone)
    {
        if ($telephone) {
            return $query->where("telephone", "LIKE", "%$telephone%");
        } else{
          return $query;  
        } 
    }
}

在控制器

public index() 
{
        $posts   = Lead::CallDateFrom(Input::get('call_date_from'))
                        ->CallDateTill(Input::get('call_date_till'))
                        ->Telephone(Input::get('telephone'))
                        ->orderBy('created_at', 'DESC')
                        ->paginate();
}