Nitish Kumar Nitish Kumar - 27 days ago 8
PHP Question

How to use laravel collection helper methods?

I'm trying to build a small application on

laravel-5.4
where I'm having a relational query something like this:

$companies = Company::where('is_client', '=', 1)
// load count on distant model
->with(['interactionSummaries.interaction' => function ($q) {
$q->withCount(['contactsAssociation' => function ($q) {
$q->whereHas('company', function ($q) {
$q->where('type', 'like', 'Investor');
});
}]);
}])
->get();


Now I want to collect all the
contact_association_counts
generated from the query and add it to individual company collection For this I'm using
pluck
,
collapse
and
sum
method, but I don't know it is not calculating as desired. Following is the screenshots:

I get list of collection as following:

list of company

Now I get the attributes:

Attributes

Now relational data:

relational data

Now interaction data, where the count belongs:

Interaction data

So for this I tried:

$companies = Company::where('is_client', '=', 1)
// load count on distant model
->with(['interactionSummaries.interaction' => function ($q) {
$q->withCount(['contactsAssociation' => function ($q) {
$q->whereHas('company', function ($q) {
$q->where('type', 'like', 'Investor');
});
}]);
}])
->get()
->transform(function ($company) {
$company->contacts_association_count = $company->interactionSummaries
->pluck('interaction.contacts_association_count')
->collapse()
->sum();
return $company;
});


But this is not calculating the counts, all the counts are coming to 0

Help me out in this. Thanks

Answer Source

I believe that your problem is the ->collapse() seeing your example after the ->pluck('interaction.contacts_association_count') you should have a flat array as [1,2,3,4,5] if you apply collapse() to a flat array it returns a void array [] and the sum of a void array is 0

$companies = Company::where('is_client', '=', 1)
    // load count on distant model
    ->with(['interactionSummaries.interaction' => function ($q) {
        $q->withCount(['contactsAssociation' => function ($q) {
            $q->whereHas('company', function ($q) {
                $q->where('type', 'like', 'Investor');
            });
        }]);
    }])
    ->get()
    ->transform(function ($company) {
        $company->contacts_association_count = $company->interactionSummaries
            ->pluck('interaction.contacts_association_count')
            //->collapse()
            ->sum();
        return $company;
    });

I hope it works... good luck!