我有一个具有如下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 未设置或已设置,则每个呼叫都属于一个 Campaign大于呼叫模型中的 call_start
在控制器中我这样做:
$calls = Call::orderBy('call_start','DESC')->get(); //in simplest form
return view('calls')->with('calls',$calls);
在查看活动列表中,我还使用以下方式显示活动信息
@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))
您无法对日期时间字段执行空比较。在添加 where 子句之前,您需要确保 $callStart 不为 null
->orWhere('end_date','>=',$callStart);
$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。
请检查您的
dd($callStart)
希望这不是空的
另外,检查
$callStart
值是否有日期。