Laravel Illegal运算​​符和值组合with()与belongsTo()关系的异常

时间:2016-02-17 10:49:20

标签: php laravel laravel-5.2

我有一个带有belongsTo()关系的调用模型,如下所示

class Call extends Model
{
    public function campaign()
    {
        $callStart = $this->call_start;
        return $this->belongsTo('App\Campaign','gsm_number','gsm_number')
        ->where(function($query) use($callStart){
            $query->where('end_date','=','0000-00-00 00:00:00')
                ->orWhere('end_date','>=',$callStart);
        })->where(function($query) use($callStart){
            $query->where('start_date','=','0000-00-00 00:00:00')
                ->orWhere('start_date','<=',$callStart);
        });

    }
}

这种关系的逻辑是,如果两个表中的gsm_numbers匹配且Campaign中的start_date的call_start未设置或小于Call模型中的call_start且Campaign模型中的end_date未设置或者未设置,则每个调用都属于一个广告系列。它大于Call Model

中的call_start

在控制器中我做:

$calls = Call::orderBy('call_start','DESC')->get(); //in simplest form
return view('calls')->with('calls',$calls);

在View for campaign列表中,我还使用以下

显示广告系列信息
@foreach($calls as $call)
      {{ $call->campaign['name'] }}
@endforeach

没问题,但我需要对ajax调用执行相同的问题,所以我需要调用数据和广告系列。所以我做了以下

$calls = Call::with('campaign')->orderBy('call_start','DESC')
            ->get();

if($request->ajax()){
  return $calls
}

在这种情况下,我得到例外InvalidArgumentException in Builder.php line 464: Illegal operator and value combination.

异常堆栈:

in Builder.php line 464
at Builder->where('end_date', '>=', null, 'or')
at call_user_func_array(array(object(Builder), 'where'), array('end_date', '>=', null, 'or')) in Builder.php line 640
at Builder->where('end_date', '>=', null, 'or') in Builder.php line 656
at Builder->orWhere('end_date', '>=', null) in Call.php line 51
at Call->App\{closure}(object(Builder))

1 个答案:

答案 0 :(得分:6)

您无法在日期时间字段上执行空比较。在添加where子句->orWhere('end_date','>=',$callStart);

之前,您需要确保$ callStart不为null
 $call->campaign['name']

有效,因为$ call存在。也就是说,它包含数据。因此$callStart = $this->call_start;不会为空。但是当你有

$calls = Call::with('campaign')->orderBy('call_start','DESC')->get();

查询构建器调用您的关系“campaign”,并将您的$callStart = $this->call_start;计算为null,因为Call还不是有效的模型实例,还没有设置数据,因此call_start属性将为null那一点。