【问题标题】:Laravel Eloquent - Unable to fetch columns using arrayLaravel Eloquent - 无法使用数组获取列
【发布时间】:2020-11-25 07:37:32
【问题描述】:

我正在使用 laravel eloquent 从多个列中获取数据。我正在使用数组从多个列中获取数据。为简单起见,我将显示两列中的数据。

这是我的数据库表,其中包含 callee_numbercaller_number

这是我使用数组获取列的代码:

    $paramArray = $params->all();

    $Caller_number = "";
    $Callee_number = "";

    if (isset($paramArray['Caller_number']) && $paramArray['Caller_number'] != '') {
        $Caller_number = $params->input('Caller_number');
    }
    if (isset($paramArray['Callee_number']) && $paramArray['Callee_number'] != '') {
        $Callee_number = $params->input('Callee_number');
    }

    if($Caller_number!=null){
        $querypart[] = "caller_number=$Caller_number";
    }
    if($Callee_number!=null){
        $querypart[] = "callee_number=$Callee_number";
    }


    $FinalQueryPart = '';
    if (!empty($querypart)) {
        
        $Seprator = "";
        foreach ($querypart as $querypartValue) {
            $FinalQueryPart .= $Seprator . $querypartValue;
            $Seprator = " AND ";
        }
    }

    $FinalQueryPart = trim($FinalQueryPart); //Output: "caller_number=783 AND callee_number=77"
    

但是,在上面的代码之后运行以下代码后,我得到了错误:

    $gets = Tbcdrnew::where(function ($query) use ($FinalQueryPart) {
        $query->MIN('uniqueid')->where($FinalQueryPart)
            ->from('cdrnew');
            
    })->groupBy('uniqueid')->orderBy('Start_Date','DESC')->get();

错误如下:

Illuminate\Database\QueryException: SQLSTATE[42S22]: Column not found: 1054 Unknown column 'caller_number=783 AND callee_number=77' in 'where clause' (SQL: select * from `cdrnew` where (`caller_number=783 AND callee_number=77` is null) group by `uniqueid`

没有发现我的代码有什么问题。有人可以纠正我吗?

【问题讨论】:

  • 未知列'caller_number=783 AND callee_number=77'
  • where() 更改为whereRaw()

标签: php laravel eloquent


【解决方案1】:

我认为您在查询中犯了一个错误。 用这些替换以下行:

if($Caller_number!=null){
    $querypart[] = "caller_number = '$Caller_number'";
}
if($Callee_number!=null){
    $querypart[] = "callee_number = '$Callee_number'";
}

(注意$Caller_number$Callee_number 上的单引号)。

另外,使用whereRaw() 方法代替where(),正如回复评论中所建议的那样。

【讨论】:

  • @Shreeniwas 对不起,我把引号放在了另一边。再试一次
  • 但需要 whereRaw
  • 是的,你是对的。另一种可能性是手动检查caller_number 是否不为空并将where() 子句添加到$query 对象(与另一个var 相同),这有点棘手。我认为当前的实现已经足够好了:)
【解决方案2】:

我正在添加一个答案,建议一种通过使用 Laravel 收集方法消除所有 if 条件来简化代码的方法。

$query = Tbcdrnew::query();                           //start a query string based on Tbcdrnew model OR you could do DB::table('cdrnew');
collect($paramArray)->filter(function($value, $key){  //convert paramArray into a collection
    return $value != '';                              //filter all null and empty values
})->each(function($value, $key) use ($query){         //iterate through all filtered values
    $query->where(strtolower($key), $value);          //assuming array key is always column key in lowercase
});
$result = $query->groupBy('uniqueid')->orderBy('start_date','desc')->get();

我不确定您在原始查询中的 $query->MIN 是否是有效的查询构建器函数。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-07-07
    • 2021-12-07
    • 1970-01-01
    • 2021-12-10
    • 1970-01-01
    • 1970-01-01
    • 2013-11-20
    相关资源
    最近更新 更多