У меня есть модель вызова с отношением 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 в обеих таблицах совпадают, а call_start из start_date в Кампании либо не задано, либо меньше, чем call_start в модели Call, а end_date в модели Campaign не увядает, или больше чем call_start из Call Model
В контроллере я делаю:
 $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)) 
          Вы не можете выполнить нулевое сравнение в поле datetime.  Вы должны убедиться, что $ callStart не имеет значения null до добавления предложения where ->orWhere('end_date','>=',$callStart); 
  $call->campaign['name'] 
  работает, потому что существует $ call.  то есть он содержит данные.  следовательно $callStart = $this->call_start;  не будет null.  но когда у вас есть 
 $calls = Call::with('campaign')->orderBy('call_start','DESC')->get(); 
  построитель запросов вызывает ваше отношение «кампания» и оценивает ваш $callStart = $this->call_start;  как null, так как Call еще не является допустимым экземпляром модели, к нему еще не установлены данные, поэтому атрибут call_start будет null в этой точке.