我有一个带有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))
答案 0 :(得分:6)
您无法在日期时间字段上执行空比较。在添加where子句->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那一点。