У меня есть модель вызова с отношением 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 в этой точке.