Laravel background jobs

C++ JAVA
Post Reply
User avatar
Revelation
Web-tourist
Web-tourist
Posts: 861
Joined: Sun Mar 24, 2013 1:23 pm
Answers: 62

Post by Revelation » Wed May 02, 2018 3:17 pm

С въображение, хаха.

Пиша от телефона за това ще съм кратък.

Не е нужно да ги попълваш при регистрация. Просто там където ще строиш правиш проверка, ако нямаш записи в тази таблица, означава че всички сгради са ти на 0. Вече като започнеш да строиш си я попълваш за всяка една нова сграда. Оттам нататък ъпдейтваш нивото на сградата, ако съществува вече запис.

Това е лесно с Ларавел като използваш updateOrCreate() метода.

pix3l
Нов
Нов
Posts: 161
Joined: Sat Oct 08, 2016 2:31 pm

Post by pix3l » Wed May 02, 2018 3:24 pm

Разделяй таблиците според предназначението им. Например таблицата юзърс трябва да съдържа само данни, отнасящи се за юзърите, таблицата билдингс трябва да съдържа само данни за сградите. Ако започнеш да смесваш данноте, не отива на добре. По-добре направи трета таблица с имотите на юзъра - какви сгради си е купил, кое ниво са и т.н.

User avatar
teroristd
Много Редовен
Много Редовен
Posts: 1769
Joined: Thu Feb 18, 2010 11:50 am
Answers: 83

Post by teroristd » Wed May 02, 2018 3:36 pm

pix3l wrote:Разделяй таблиците според предназначението им. Например таблицата юзърс трябва да съдържа само данни, отнасящи се за юзърите, таблицата билдингс трябва да съдържа само данни за сградите. Ако започнеш да смесваш данноте, не отива на добре. По-добре направи трета таблица с имотите на юзъра - какви сгради си е купил, кое ниво са и т.н.
Точно това се опитвам да направя, само дето не ми се получава :D .

pix3l
Нов
Нов
Posts: 161
Joined: Sat Oct 08, 2016 2:31 pm

Post by pix3l » Wed May 02, 2018 4:47 pm

Направи го както си знаеш, после като се наложи refactoring ще разбереш къде си сбъркал... даже още по-добре, така придобиваш опит. :D

Даже, ако не ти е проблем, ползвай ORM. Ти се грижиш за обектите и връзката между тях, а ORM-а се грижи за базата с данни, ключове и т.н.

User avatar
teroristd
Много Редовен
Много Редовен
Posts: 1769
Joined: Thu Feb 18, 2010 11:50 am
Answers: 83

Post by teroristd » Wed May 02, 2018 5:45 pm

Е аз с Eloquent действам, в момента.

User avatar
Revelation
Web-tourist
Web-tourist
Posts: 861
Joined: Sun Mar 24, 2013 1:23 pm
Answers: 62

Post by Revelation » Wed May 02, 2018 11:15 pm

teroristd wrote:
pix3l wrote:Разделяй таблиците според предназначението им. Например таблицата юзърс трябва да съдържа само данни, отнасящи се за юзърите, таблицата билдингс трябва да съдържа само данни за сградите. Ако започнеш да смесваш данноте, не отива на добре. По-добре направи трета таблица с имотите на юзъра - какви сгради си е купил, кое ниво са и т.н.
Точно това се опитвам да направя, само дето не ми се получава :D .
Свикнеш ли.. или по-скоро схванеш ли идеята, ще видиш, че е много по-лесно да си разделиш таблиците и ще е много по-лесно да се работи с тях.
Но само да добавя, че не винаги Eloquent е най-добрия избор. Понякога ще те обърква само и ще се чудиш с часове как да извъртиш нещата, за да го накараш да работи, както искаш и особено, ако искаш да си спестиш броя на заявките.

П.П. Добави си https://github.com/barryvdh/laravel-debugbar този плъгин към ларавел, за да можеш да следиш по-лесно кое кога се рендира, какви заявки точно се изпълняват, какви логове вървят(това в повечето случаи ти трябва да на теб да дебъгваш своя код), какви грешки има и т .н. Абе доста е полезен при разработка.

User avatar
teroristd
Много Редовен
Много Редовен
Posts: 1769
Joined: Thu Feb 18, 2010 11:50 am
Answers: 83

Post by teroristd » Tue May 08, 2018 7:10 am

Имам един проблем с queue-то. Ако хардкодна данните както съм показал по-долу си работи.

[php]
public function handle()
{
MinesLevels::where('user_id', 1)
->update(['gold_mine' => 1]);
}
[/php]

Обаче ако например вместо 1 за user_id си викам класа не иска да работи. Изобщо в заявките ако стойностите не са хардкоднати не бачка. Къде може да е проблема?

[php]
public function handle()
{
MinesLevels::where('user_id', Auth::user()->id)
->update(['gold_mine' => 1]);
}
[/php]

Fakeheal
Гуру
Гуру
Posts: 2703
Joined: Sat Apr 17, 2010 6:37 am
Answers: 351
Location: /r/eyebleach
Contact:

Post by Fakeheal » Tue May 08, 2018 7:50 am

(Командата) Job-a (поправка) не може да използва auth, така че трябва да си подадеш на самата команда ID-то на логнатия юзър.

Представи си че работят успоредно, а не съвместно с уеб приложението.

Code: Select all

class UpdateMineLevels extends Job implements ShouldQueue
{
    private $user_id;

    public function __construct($user_id)
    {
        $this->user_id = $user_id;
    }

    public function handle()
    {
        MinesLevels::where('user_id', $this->user_id)
            ->update(['gold_mine' => 1]);
    }

}

//И после
// Предполагам ползваш trait-a ShouldQueue
//$this->dispatch(new UpdateMineLevels(Auth::user()->id));

User avatar
teroristd
Много Редовен
Много Редовен
Posts: 1769
Joined: Thu Feb 18, 2010 11:50 am
Answers: 83

Post by teroristd » Tue May 08, 2018 8:32 am

Ясно, а това само за Auth ли важи или за всички класове зад фасада?

Fakeheal
Гуру
Гуру
Posts: 2703
Joined: Sat Apr 17, 2010 6:37 am
Answers: 351
Location: /r/eyebleach
Contact:

Post by Fakeheal » Tue May 08, 2018 8:40 am

teroristd wrote:Ясно, а това само за Auth ли важи или за всички класове зад фасада?
Малко те обърках с изречението по-горе, за което се извинявам.

Проблема не е във фасадата, а в сесията. Тъй като този job се изпълнява от cli(?) няма сесия сетната. Затова и няма логнат юзър и Auth::user() е празно.

Post Reply