Search code examples
phplaravellaravel-5.4laravel-collection

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


Solution

  • 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!