Laravel 非法运算符和值组合在 with() 和 ownTo() 关系上出现异常

问题描述 投票:0回答: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 未设置或已设置,则每个呼叫都属于一个 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))
php laravel laravel-5
2个回答
15
投票

您无法对日期时间字段执行空比较。在添加 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。


0
投票

请检查您的

 dd($callStart)

希望这不是空的

另外,检查

$callStart
值是否有日期。

© www.soinside.com 2019 - 2024. All rights reserved.