wwwrrrxxx
wwwrrrxxx

Reputation: 195

laravel filter only nested condition

I want to filter ONLY nested values in dealTransactions.

In plain English, Merchant wants only dealTransactions have provided dates with Deals.

I tried something like below but it does not work.

dates = ['2019-01-01', '2019-01-02', '2019-01-03', '2019-01-04', '2019-01-05'];


$merchant = Merchant::with(['deals.dealTransactions'])->where('slug', $slug)
                ->whereHas('deals.dealTransactions', function($query) use ($dates) {
                    foreach($dates as $date) {
                        $query->where('date', '=', $date);
                    }                        
                })
                ->first();




deal_transactions table

id, deal_id, date 


deals table 
id, merchant_id, 


merchants table
id, many columns for merchant  

Thank you

Upvotes: 0

Views: 51

Answers (2)

lagbox
lagbox

Reputation: 50531

You should be able to do this with a eager load constraint on the nested relationship:

$merchant = Merchant::where('slug', $slug)
    ->with(['deals.dealTransactions' => function ($query) use ($dates) {
        $query->whereIn('date', $dates);
    }])->first();

Upvotes: 1

Alexandre Demelas
Alexandre Demelas

Reputation: 4700

If I understood correctly your schema, this might help:

// Here you define the scope that will be used to select & eager load.
$transactionsScope = function ($q) use ($dates) {
    return $q->whereIn('date', $dates);
};
// All merchant of slug in/with that transaction's scope.  
$merchant = Merchant::where('slug', $slug)
    ->whereHas('deals', function ($q) use ($transactionsScope) {
        return $q->whereHas('dealTransactions', $transactionsScope);
    })
    ->with(['deals' => function ($q) use ($transactionsScope) {
        return $q->with('dealTransactions', $transactionsScope);
    }])
    ->firstOrFail();

Upvotes: 1

Related Questions