cybercog / laravel-love

Add Social Reactions to Laravel Eloquent Models. It lets people express how they feel about the content. Fully customizable Weighted Reaction System & Reaction Type System with Like, Dislike and any other custom emotion types. Do you react?

Home Page:https://komarev.com/sources/laravel-love

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

love:recount error following custom migration

vesper8 opened this issue · comments

I am performing a migration from cybercog/laravel-likeable v3 straight to laravel-love v8

I found it much easier to do a custom migration then to perform each step of the Upgrade guide manually.

I have a rather simple scenario where my only reacters/reactants are my User model. Users can like other users and that's it.. pretty simple.

I added love_reactant_id and love_reactor_id to my user model, I populated the love_reacters and love_reacants tables, I populated the love_reaction_types model and finally I converted the old likes table to the love_reactions table, making sure to use the correct reacter/reactant id

All this is working great.

My problem is that now both the love_reactant_reaction_totals and love_reactant_reaction_counters tables are empty

I thought this wouldn't be a problem since I figured the love:recount command would recalculate/repopulate both of those tables.. but it seems maybe I was wrong to assume this.

It seems like the love:recount command actually depends on the love_reactant_reaction_totals data in order to recalculate the love_reactant_reaction_counters table

But then isn't there a way to recalculate the love_reactant_reaction_totals table?

Right now I am getting this error when trying to run love:recount: Symfony\Component\Debug\Exception\FatalThrowableError : Call to undefined method Cog\Laravel\Love\Reactant\ReactionTotal\Models\NullReactionTotal::update()

I thought this might be the same problem described in #80 but it seems not, I have tried using the sync queue as well as making sure my queues are active.. and I think the problem is that my love_reactant_reaction_totals is empty

Can you confirm? Is there a way to recalculate that table?

Thank you

Alternatively, I could generate those two tables by iterating over the old likes table and running the reactTo()method, this works wonderfully except that I lose the created_at/updated_at which is no good since I do want to keep this data to know when the likes were performed.

If you could add the possibility of passing an optional 4th parameter to pass the date to the reactTo method that would be nice.. in the meantime if it's possible to recalculate the two statistics table that would also solve my issue

Hi @vesper8!

If reactions are working I suppose that it's just typo here, but re-check that column in User model called love_reacter_id and not love_reactor_id.

I've refreshed implementation of counters in terms of #119 in my mind today morning, and saw that there are issues in it. It definitely need to be refactored.

Related to this issue - the problem in recounting command that it doesn't create missing counters. So if they are not exists - it wouldn't work. All we need to do - add counter creation command if we've got NullReactionCounter and add total creation if we've got NullReactionTotal.

This bug has been fixed in PR #148

@vesper8 You could try fix in the master branch:

composer require cybercog/laravel-love:dev-master

It will be released as v8.3 on the next week.

Looking forward to 8.3 @antonkomarev : ) is it due any day now?

@vesper8 working on it right now ;)

Great @antonkomarev ! I've tested it and it works very well, much better and seemingly faster than before.

I was still unable to run php artisan love:recount from the CLI as I immediately ran into an "Out of Allowed Memory exception"

I worked around it by creating a custom command that executes the following:

    public function handle()
    {
        ini_set('max_execution_time', 9999);
        ini_set('memory_limit', '2048M');

        $users = User::withTrashed()->whereNotNull('love_reactant_id')->orderBy('id')->get();

        $this->info(sprintf('Found %d users for recounting', $users->count()));
        
        $reactionTypes = ReactionType::all();

        foreach ($reactionTypes as $reactionType) {
            foreach ($users as $user) {
                $reactant = $user->getLoveReactant();
                RebuildReactionAggregatesJob::dispatch($reactant, $reactionType)
                ->onConnection('sync');
            }
        }
    }

The two ini_set are key to this working on the command line. I do this with many of my more memory-intensive jobs.

Happy to report I was also able to get the same results by running this from the command line:

php -d memory_limit=-1 artisan love:recount

Thanks for sharing it, @vesper8! I've added this hint to the documentation:
https://laravel-love.readme.io/docs/recount-statistics#section-out-of-allowed-memory