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

Dan*_*tti 5 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);
        });

    }
}
Run Code Online (Sandbox Code Playgroud)

这种关系的逻辑是,每次调用所属的广告,如果两个表中gsm_numbers匹配和call_start从运动起始日期或者未设置或小于呼叫模型和运动模型END_DATE call_start是枯萎没有设置或者是更大来自Call Model的call_start

在控制器我做:

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

在View for campaign列表中,我还使用以下内容显示广告系列信息

@foreach($calls as $call)
      {{ $call->campaign['name'] }}
@endforeach
Run Code Online (Sandbox Code Playgroud)

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

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

if($request->ajax()){
  return $calls
}
Run Code Online (Sandbox Code Playgroud)

在这种情况下,我得到例外 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))
Run Code Online (Sandbox Code Playgroud)

Ayo*_*emi 9

您无法在日期时间字段上执行空比较.在添加where子句之前,您需要确保$ callStart不为null->orWhere('end_date','>=',$callStart);

 $call->campaign['name']
Run Code Online (Sandbox Code Playgroud)

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

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

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