Как рассчитать данные по категориям при создании новых данных с той же категорией

Модель

public static function findOrCreate($plan_id, $data)
{
    $fromDate = Carbon::now()->subDay()->startOfWeek();
    $nowDate = Carbon::now()->today();

    $spent_time = static::where('plan_id', $plan_id)->first();

    if (is_null($spent_time)) {
        return static::create($data);
    }else{
        $new_spent_time = SpentTime::find($plan_id);
        $task_category = $new_spent_time->task_category;

        $new_spent_time->task_category = (['{task_category}' => $task_category, 
                                        '{daily_spent_time}' => $new_spent_time->daily_spent_time,
                                        '{daily_percentage}' => $new_spent_time->daily_percentage,
                                        '{spent_time}' => $new_spent_time->spent_time,
                                        '{percentage}' => $new_spent_time->percentage, $new_spent_time->task_category]);

        $new_spent_time->spent_time = $new_spent_time::where('task_category',$task_category)
                                    ->sum('daily_spent_time', $new_spent_time->daily_spent_time , $fromDate);
        $new_spent_time['spent_time'] = (int)$new_spent_time->spent_time + $spent_time->daily_spent_time;

        $new_spent_time->percentage = $new_spent_time::where('task_category',$task_category)
                                    ->sum('daily_percentage', $new_spent_time->daily_percentage, $fromDate);
        $new_spent_time['percentage'] = (int)$new_spent_time->percentage  + $spent_time->daily_percentage;

        return $spent_time->update($data);
    }
}

Контроллер

public function store(Request $request)
{      
    $spent_time = SpentTime::findOrCreate($request->get('plan_id'), [
        'plan_id' => $request->get ('plan_id'),
        'daily_spent_time' => $request->get ('daily_spent_time'),
        'daily_percentage' => $request->get ('daily_percentage'),
        'reason' => $request->get ('reason'),
    ]);

    return redirect()->route('real.index', compact( 'spent_time'));
}

Вид

Как рассчитать данные по категориям при создании новых данных с той же категорией

with problems, when saving create new data then an error "Trying to get property of non-object"

Как рассчитать данные по категориям при создании новых данных с той же категорией

but there is one data that can save when creating new data, but cannot yet calculate the data, and while the other categories cannot be like that, instead the error

Как рассчитать данные по категориям при создании новых данных с той же категорией

what should be corrected from this problem?

$new_spent_time вообще не сохраняется. Вы также создаете обновление как properties, так и массива keys. Выбери один.
thisiskelvin 19.10.2018 11:30

Так что нужно улучшить? извините, я все еще учусь, так что все еще не понимаю вашей точки зрения.

Lia nur fadilah 19.10.2018 11:35

Структура немного сложна для понимания, я посмотрел, но запутался, где вы использовали предложения where(). Вы можете запустить where() на одной записи.

thisiskelvin 19.10.2018 11:53

так что поменять?

Lia nur fadilah 19.10.2018 11:56

Не могли бы вы обновить свой вопрос своей моделью и модельными отношениями, чтобы я понял, чего пытаетесь достичь.

thisiskelvin 19.10.2018 12:00

Разве не в этой строке $task_category = $new_spent_time->task_category; проблема в вопросе? Я полагаю, что возвращаемое значение $new_spent_time равно нулю или что-то вроде не объект. Я думаю, вам может понадобиться проверить if ($new_spent_time !== null) или другие проверки ... как насчет этого?

Oluwatobi Samuel Omisakin 19.10.2018 12:04

@thisiskelvin при создании новых данных с той же категорией данные о потраченном времени должны рассчитываться с предыдущими данными (той же категории), которые есть в таблице TST, а также с процентным соотношением

Lia nur fadilah 19.10.2018 12:06

@Qiuwatobi $ new_spent_time есть данные

Lia nur fadilah 19.10.2018 12:11

Я бы сказал, что вам не нужно добавлять это в запись базы данных. Это можно рассчитать с помощью другой модельной функции. Причина в том, что у каждой записи в какой-то момент не будет одинакового времени, поскольку она не была сохранена. При необходимости с помощью осциллографа можно будет рассчитать процент time and . Я создам пример для дальнейшего объяснения.

thisiskelvin 19.10.2018 12:21

@thisiskelvin спасибо, жду ответа

Lia nur fadilah 19.10.2018 12:25

Это так? public function getDailySpentTimeAttribute() { return self::where('task_category', $this->task_category['daily_Spent_time'] == 'daily_spent_time') ->get() ->sum('daily_spent_time'); }

Lia nur fadilah 23.10.2018 03:53
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
11
107
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

обновить модель

public static function findOrCreate($plan_id, $data)
{
    $fromDate = Carbon::now()->subDay()->startOfWeek();
    $nowDate = Carbon::now()->today();

    $spent_time = static::where('plan_id', $plan_id)->first();

    if (is_null($spent_time)) {
        return static::create($data);
    }else{

        $new_spent_time = SpentTime::first();
        $task_category = $new_spent_time->task_category;

        $new_spent_time->task_category = (['{task_category}' => $task_category, 
                                        '{daily_spent_time}' => $new_spent_time->daily_spent_time,
                                        '{daily_percentage}' => $new_spent_time->daily_percentage,
                                        '{spent_time}' => $new_spent_time->spent_time,
                                        '{percentage}' => $new_spent_time->percentage, $new_spent_time->task_category]);

        $new_spent_time->spent_time = $new_spent_time::where('task_category',$task_category)
                                    ->sum('daily_spent_time', $new_spent_time->daily_spent_time , $fromDate);
        $new_spent_time['spent_time'] = (int)$new_spent_time->spent_time + $spent_time->daily_spent_time;

        $new_spent_time->percentage = $new_spent_time::where('task_category',$task_category)
                                    ->sum('daily_percentage', $new_spent_time->daily_percentage, $fromDate);
        $new_spent_time['percentage'] = (int)$new_spent_time->percentage  + $spent_time->daily_percentage;

        return $spent_time->update($data);
    }
}

В вашей модели SpentTime вы можете создать аксессуары - функции, которые можно использовать здесь для запроса суммы всех связанных записей за день:

public function getDailySpentTimeAttribute()
{
    return self::where('task_category_id', $this->task_category_id)
        ->get()
        ->sum('daily_spent_time');
}

public function getDailyPercentageAttribute()
{
    return self::where('task_category_id', $this->task_category_id)
        ->get()
        ->sum('daily_percentage');
}

Здесь мы создаем два accessors, один для получения ежедневного затраченного времени, а другой - для получения ежедневного процента для всех записей на основе связанных task_category.

Вызвать можно с помощью следующего:

$dailySpentTime = SpentTime::find($id)->dailySpentTime;

// or within your blade template

{{ $spentTime->dailySpentTime }}

Обновлять

В вашем контроллере, поскольку вам больше не нужно выполнять какие-либо вычисления после сохранения, вы можете сделать следующее:

public function store(Request $request)
{      
    $spent_time = SpentTime::findOrCreate($request->get('plan_id'), [
        'task_category' => $request->get('task_category'),
        'reason'        => $request->get('reason'),
    ]);

    return redirect()->route('real.index', compact('spent_time'));
}

Обязательно удалите свой собственный метод findOrCreate(), который в настоящее время переопределяет версию laravel.

Надеюсь, это поможет.

есть ли дополнительный вызов к контроллеру?

Lia nur fadilah 22.10.2018 03:34

В методе контроллера store() необходимо только обычное сохранение. dailySpentTime можно вызвать на любой записи SpentTime.

thisiskelvin 22.10.2018 10:14

Обновлено. Пожалуйста, дайте мне знать, если вы понимаете.

thisiskelvin 22.10.2018 10:25

ошибка Call to a member function getDailySpentTimeAttribute() on boolean

Lia nur fadilah 22.10.2018 11:24

Вы можете dd()$spent_time, чтобы увидеть, что отголоски.

thisiskelvin 22.10.2018 11:28

Какие данные вы видите?

thisiskelvin 22.10.2018 11:41

Взгляните здесь: laravel.com/docs/5.7/… Вам нужно append новые значения для ответа json.

thisiskelvin 22.10.2018 11:46

Это так?

Lia nur fadilah 22.10.2018 12:04

Нет. И вы возвращаете время сервера в функциях. Найдите время, чтобы узнать о средствах доступа и других функциях для laravel. Это обязательно поможет в будущем.

thisiskelvin 22.10.2018 12:07

может создавать новые данные, если это сделать, но не может рассчитывать данные по той же категории public function getDailySpentTimeAttribute($value) { return $this->attributes['daily_spent_time'] = ucfirst($value); }

Lia nur fadilah 23.10.2018 05:04

the data is there, when dd($spent_time);

dd($spent_time);

Ответ принят как подходящий

Обновить ответ

Модель

public static function findOrCreate($plan_id, $data)
{
    $spent_time = static::where('plan_id', $plan_id)->first();
    $task_category = $spent_time->task_category;

    if (is_null($spent_time)) {
        return static::create($data);
    }else{

        $spent_time['spent_time'] = $spent_time->spent_time + $spent_time->daily_spent_time;

        $spent_time['percentage'] = $spent_time->percentage  + $spent_time->daily_percentage;
        return $spent_time->update($data);
    }
}

Контроллер

public function index()
{
    $spent_times = SpentTime::orderBy('task_category')->where('created_at', '>=', Carbon::today()->toDateString())->paginate(10);
    $user_stories = Plan::pluck('user_story', 'id');
    $real = new SpentTime;

    return view('reals.index', compact('spent_times', 'user_stories', 'real'));
}

public function store(Request $request)
{    
    $spent_time = SpentTime::findOrCreate($request->get('plan_id'), [
        'plan_id' => $request->get ('plan_id'),
        'daily_spent_time' => $request->get ('daily_spent_time'),
        'daily_percentage' => $request->get ('daily_percentage'),
        'reason' => $request->get ('reason'),
    ]);
    return redirect()->route('real.index', compact( 'spent_time'));
}

Другие вопросы по теме