J'interroge les véhicules avec le nom et le type du modèle, mais ces clauses where ne sont pas à la fin après avoir ajouté ouWhere
. Lorsque je commente ou supprime ces clauses ouWhere
, cela fonctionne.
$models = Vehicle::join('vmodels', 'vmodels.vehicle_id', '=', 'vehicles.id') ->join('vehicletypes', 'vehicletypes.id', '=', 'vehicles.vehicletype_id') ->join('brands', 'brands.id', '=', 'vehicles.make') ->join('companies', 'brands.id', '=', 'companies.name') ->select('vehicles.slug as vslug', 'brands.name as brandname', 'vehicles.id as vid', 'vmodels.*', 'vehicletypes.name as vtype', 'companies.status as cstatus') ->where('brands.name', 'LIKE', "%{$term}%") ->orWhere('vmodels.name', 'LIKE', "%{$term}%") ->orWhere('vmodels.year', 'LIKE', "%{$term}%") ->orWhere('vehicletypes.name', 'LIKE', "%{$term}%") ->orWhere('vehicles.model', 'LIKE', "%{$term}%") ->where('companies.status', '=', 1 ) ->where('vmodels.status', '=', 1) ->where('vehicles.status', '=', 1) ->paginate(30);
3 Réponses :
Regroupez vos semblables ouWhere
,
$models = Vehicle::join('vmodels', 'vmodels.vehicle_id', '=', 'vehicles.id') ->join('vehicletypes', 'vehicletypes.id', '=', 'vehicles.vehicletype_id') ->join('brands', 'brands.id', '=', 'vehicles.make') ->join('companies', 'brands.id', '=', 'companies.name') ->select('vehicles.slug as vslug', 'brands.name as brandname', 'vehicles.id as vid', 'vmodels.*', 'vehicletypes.name as vtype', 'companies.status as cstatus') ->where(function($query) use($term){ $query->where('brands.name', 'LIKE', "%{$term}%") ->orWhere('vmodels.name', 'LIKE', "%{$term}%") ->orWhere('vmodels.year', 'LIKE', "%{$term}%") ->orWhere('vehicletypes.name', 'LIKE', "%{$term}%") ->orWhere('vehicles.model', 'LIKE', "%{$term}%"); }) ->where('companies.status', '=', 1 ) ->where('vmodels.status', '=', 1) ->where('vehicles.status', '=', 1) ->paginate(30);
Référence: https://laravel.com/docs/5.7/queries#parameter-grouping
si vous souhaitez simuler une instruction AND / OR pour vos requêtes SQL avec le générateur de requêtes Laravel, vous devez le faire comme ceci:
((A or B) and (C or D)) or (E) ModelName::join(...)->join(...) ->where(function($query){ $query->where( A ) ->orWhere( B ) }) ->where(function($query){ $query->where( C ) ->orWhere( D ) })->orWhere( E )
How about this one $models = Vehicle::join('vmodels', 'vmodels.vehicle_id', '=', 'vehicles.id') ->join('vehicletypes', 'vehicletypes.id', '=', 'vehicles.vehicletype_id') ->join('brands', 'brands.id', '=', 'vehicles.make') ->join('companies', 'brands.id', '=', 'companies.name') ->select('vehicles.slug as vslug', 'brands.name as brandname', 'vehicles.id as vid', 'vmodels.*', 'vehicletypes.name as vtype', 'companies.status as cstatus') ->where('brands.name', 'LIKE', "%{$term}%") ->where('companies.status', '=', 1 ) ->where('vmodels.status', '=', 1) ->where('vehicles.status', '=', 1) ->orWhere(function($query) use ($term){ $query->where('vmodels.name', 'LIKE', "%{$term}%") ->where('vmodels.year', 'LIKE', "%{$term}%") ->where('vehicletypes.name', 'LIKE', "%{$term}%") ->where('vehicles.model', 'LIKE', "%{$term}%") }) ->paginate(30);