I have a table name “Offers” with 3 (public, request, private ) types of data. Now I want to show directly to the user end public and request offers. and private offers not be shown but when admin will add user_id and offer_id in a new table (offer_access) then the private offer should be available to user end for only these users.
$offer = Offer::where('status', 'public')->orWhere('status', 'request')->latest()->get();
I wrote this one and getting public and private offers for user end. Now I want to show private offers to a user when it available on “OfferAccess” table.
So now, How can I write the SQL query for that?
Advertisement
Answer
You can try blow:
$offer = Offer::whereIn('status', ['public', 'request'])
->orWhere(function($query) {
$query->where('status', 'private')
->whereHas('OfferAccess', function($qry) {
$qry->where('user_id', auth()->user()->id);
});
})->get();
If you need only the latest results can use ->latest()->get()
instead of only ->get()
.
Also if you need to get it for any other user than the current logged in user, then you need to pass user_id
to closure function. so you need to use updated orWhere
like as:
->orWhere(function($query) use ($user_id) {
$query->where('status', 'private')
->whereHas('OfferAccess', function($qry) use ($user_id) {
$qry->where('user_id', $user_id);
});
})
It should give you the desired results.