动态查询ORM Laravel 4.2

时间:2015-10-01 14:06:12

标签: php codeigniter laravel laravel-4 eloquent

好吧我有一个用CodeIgniter写的GeneralModel,一位朋友问我是否可以将它转换为Laravel 4.2给他。我正在研究这个问题,我认为我的大部分内容都是正确的,但我在选择声明中陷入困境。

CodeIgniter我有以下内容:

public function getData($table, $multiple = 1, $field = FALSE, $val = FALSE){

    if($field != FALSE){
        // WHERE in case of FIELD / VAL :)
        $this->db->where($field, $val);
    }

    $query = $this->db->get($table);

    if($multiple == 1){
        // Multiple rows
        return $query->result_array();
    } else {
        // One row
        return $query->row_array();
    }
}

有没有人知道如何将此功能转换为Laravel 4.2语法? 我目前有:

public function getData($table, $multiple = 1, $field = FALSE, $val = FALSE){
    $result = DB::table($table);

}

我很快陷入困境,因为我不知道如何在Laravel 4.2中实现同样的目标,并将query的各个部分分开,就像我使用CodeIgniter一样。

2 个答案:

答案 0 :(得分:2)

您可以用相同的方式链接方法:

public function getData($table, $multiple = 1, $field = FALSE, $val = FALSE)
{
    $query = DB::table($table);

    if ($field != FALSE) {
        // WHERE in case of FIELD / VAL :)
        $query->where($field, $val);
    }

    if ($multiple)
        return $query->get();
    else
        return $query->first();
}

答案 1 :(得分:1)

Laravel的相似之处在于,您可以在实际进行查询之前使用Fluent Query Builder在多个阶段构建查询。一旦你知道这一点,翻译就非常简单了:

public function getData($table, $multiple = 1, $field = FALSE, $val = FALSE)
{
    $query = DB::table($table);

    if($field){
        // WHERE in case of FIELD / VAL :)
        $query = $query->where($field, $val);
    }

    if($multiple) {
        return $query->get();
    }

    return $query->first();
}

我不认为在Eloquent模型中依靠Fluent真的很好,但有些情况下无法帮助。如果当前目标是将项目转换为Laravel,那么可能会调用代码依赖于此方法存在的事实。将函数转换为使用Eloquent而不是Fluent将更改函数的签名并导致代码的其他部分中断,但它看起来像这样:

public function getData($multiple = true, $field = false, $val = false)
{
    $query = $this;

    if($field) {
        $query = $query->where($field, $val);
    }

    if($multiple) {
        return $query->get();
    }

    return $query->first();
}

可以修改调用代码本身以在Laravel中执行完全相同的功能,如下所示:

// Instead of...
$result = $model->getData(1, 'field', 'value');

// You can do this:
$result = $model->where('field', 'value')->get();

// Or this if you'd rather not have multiple:
$result = $model->where('field', 'value')->first();

从长远来看,在Eloquent(恕我直言)中使用此功能并不能真正为您节省太多时间,而是大部分时间都是混乱。