Laravel Operatore non valido e combinazione di valori Eccezione con () con la relazione belongsTo ()

Ho un model di chiamata con una relazione belongsTo () come segue

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); }); } } 

La logica di questa relazione è che each chiamata appartiene a una campagna se gsm_numbers in entrambe le tabelle corrispondono e call_start da start_date in Campaign non è impostato o inferiore a call_start in Call model e end_date in Campaign il model è wither non impostato o è maggiore di call_start dal model di chiamata

In Controller Faccio:

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

Nella visualizzazione per l'elenco delle campagne, vengono visualizzate anche le informazioni sulla campagna che seguono

 @foreach($calls as $call) {{ $call->campaign['name'] }} @endforeach 

Nessun problema, ma ho bisogno di eseguire lo stesso problema con le chiamate Ajax, quindi ho bisogno di call i dati insieme alle campagne. Quindi faccio ciò che segue

 $calls = Call::with('campaign')->orderBy('call_start','DESC') ->get(); if($request->ajax()){ return $calls } 

In questo caso ottengo exception InvalidArgumentException in Builder.php line 464: Illegal operator and value combination.

Stack di eccezioni:

 in Builder.php line 464 at Builder->where('end_date', '>=', null, 'or') at call_user_func_arrays(arrays(object(Builder), 'where'), arrays('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)) 

Non è ansible eseguire un confronto nullo su un field datetime. Devi assicurarti che $ callStart non sia null prima di aggiungere una clausola where ->orWhere('end_date','>=',$callStart);

  $call->campaign['name'] 

funziona perché $ call esiste. cioè, contiene dati. quindi $callStart = $this->call_start; non sarà nullo ma quando lo hai

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

il generatore di query chiama la tua relazione "campagna" e valuta $callStart = $this->call_start; come null, poiché Call non è ancora un'istanza di model valida, nessun dato è impostato su di esso, quindi l'attributo call_start sarà nullo in quel punto.