Добро пожаловать в SO.
Одним из возможных решений было бы условное добавление предложения where ('client_id', 1).
$drate = Drate::where('from_zone','north')
->where('from_type','national')
->where('to_zone','north')
->where('to_type','metro');
if( client id provided condition is true ) // pseudo-code
$drate->where('client_id',1);
$drate = $drate->get();
Изменить: имейте в виду, что это приведет к в нескольких матчах. Обе строки в вашем примере будут сопоставлены.
Вы могли бы if / else запрос возвращать только тогда, когда client_id = null, когда он не указан whereNull ('client_id') .
if( client id provided condition is true ) // pseudo-code
$drate->where('client_id',1);
else
$drate->whereNull('client_id');
с другой стороны, он также может соответствовать другим записям с тем же условием (например, несколько строк с нулевым клиентом).
Решите, каким должен быть результат, когда client_id = null, и какая сортировка если вам требуется несколько результатов.
Например, если вам требуется, чтобы client_id = null возвращал только 1 результат, и этот результат должен быть наивысшим результатом, вы можете объединить orderBy ('rate', 'des c ') с first () вместо get ();