【问题标题】:Dynamic query ORM Laravel 4.2动态查询 ORM Laravel 4.2
【发布时间】:2015-10-01 14:06:12
【问题描述】:

好的,我有一个用 CodeIgniter 编写的 GeneralModel,一个朋友问我是否可以为他将其转换为 Laravel 4.2。我正在研究这个,我认为我的大部分内容都是正确的,但我卡在了 select 语句中。

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 中实现同样的效果,就像我在 CodeIgniter 中所做的那样拆分 query 的部分。

【问题讨论】:

    标签: php codeigniter laravel laravel-4 eloquent


    【解决方案1】:

    你可以用同样的方式链接方法:

    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();
    }
    

    【讨论】:

    • 感谢您的快速遮阳篷!没时间问他这是否对他有用,但看起来不错。
    【解决方案2】:

    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 (恕我直言) 中使用此功能并不能真正为您节省太多,而且大多只是杂乱无章。

    【讨论】:

    • 感谢您提供的 awnser,generalmodel 的主要原因是为了快速访问基本查询,在实际使用之前总是会检查/验证这些查询。只是我的一个朋友并不完全热衷于后端编程,而是需要一种快速简便的方法来在单个表上调用一些基本查询(插入、选择、计数、更新和删除)。由于在调用查询之前我自己使用了一个带有预验证的通用模型,我认为他最好使用类似的东西。
    猜你喜欢
    • 2015-04-18
    • 1970-01-01
    • 1970-01-01
    • 2015-08-02
    • 1970-01-01
    • 1970-01-01
    • 2021-03-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多