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

Модель

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'));
}

Вид

введите здесь описание изображения

с проблемами, при сохранении создать новые данные потом ошибка "Попытка получить свойство не объекта"

введите здесь описание изображения

но есть одни данные, которые могут сохранить при создании новых данных, но пока не могут вычислить данные, и пока другие категории не могут быть такими, вместо этого ошибка

введите здесь описание изображения

что нужно исправить из этой проблемы?


person Lia nur fadilah    schedule 19.10.2018    source источник
comment
$new_spent_time вообще не сохраняется. Вы также создаете обновление как properties, так и массива keys. Выбери один.   -  person thisiskelvin    schedule 19.10.2018
comment
Так что же следует улучшить? извините, я все еще учусь, поэтому до сих пор не понимаю вашей точки зрения.   -  person Lia nur fadilah    schedule 19.10.2018
comment
Структуру немного сложно понять, я посмотрел, но запутался, где вы использовали пункты where(). Вы можете запустить where() для одной записи.   -  person thisiskelvin    schedule 19.10.2018
comment
так что менять?   -  person Lia nur fadilah    schedule 19.10.2018
comment
Не могли бы вы обновить свой вопрос, указав модель и модельные отношения, чтобы я понял, чего мы пытаемся достичь.   -  person thisiskelvin    schedule 19.10.2018
comment
Разве эта строка $task_category = $new_spent_time->task_category; не является проблемой в вопросе? Я полагаю, что возвращаемое значение $new_spent_time равно null или чему-то не объектному. Я думаю, вам может понадобиться проверить if($new_spent_time !== null) или другие проверки... как насчет этого?   -  person Oluwatobi Samuel Omisakin    schedule 19.10.2018
comment
@thisiskelvin при создании новых данных с той же категорией данные затраченного_времени должны рассчитываться с предыдущими данными (той же категории), которые находятся в таблице TST, а также в процентах   -  person Lia nur fadilah    schedule 19.10.2018
comment
@Qiuwatobi $new_spent_time есть данные   -  person Lia nur fadilah    schedule 19.10.2018
comment
Я бы сказал, что вам не нужно добавлять это в запись базы данных. Это можно рассчитать, используя другую модельную функцию. Причина в том, что на каждую запись в какой-то момент не будет потрачено столько времени, сколько она не была сохранена. При использовании области можно будет вычислить time and percentages`, когда это необходимо. Я создам пример для дальнейшего объяснения.   -  person thisiskelvin    schedule 19.10.2018
comment
@thisiskelvin спасибо, жду ответа   -  person Lia nur fadilah    schedule 19.10.2018
comment
Это так? public function getDailySpentTimeAttribute() { return self::where('task_category', $this->task_category['daily_Spent_time'] == 'daily_spent_time') ->get() ->sum('daily_spent_time'); }   -  person Lia nur fadilah    schedule 23.10.2018


Ответы (4)


В вашей модели 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.

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

person thisiskelvin    schedule 19.10.2018
comment
есть дополнительный вызов контроллера? - person Lia nur fadilah; 22.10.2018
comment
В методе контроллера store() требуется только обычное сохранение. dailySpentTime можно вызывать для любой SpentTime записи. - person thisiskelvin; 22.10.2018
comment
Обновлено. Пожалуйста, дайте мне знать, если вы понимаете. - person thisiskelvin; 22.10.2018
comment
ошибка Call to a member function getDailySpentTimeAttribute() on boolean - person Lia nur fadilah; 22.10.2018
comment
Можете ли вы dd() $spent_time посмотреть, что воспроизводится эхом. - person thisiskelvin; 22.10.2018
comment
Какие данные вы видите? - person thisiskelvin; 22.10.2018
comment
Посмотрите здесь: laravel.com/docs/5.7/ Вам нужно append добавить новые значения в ответ json. - person thisiskelvin; 22.10.2018
comment
Это так? - person Lia nur fadilah; 22.10.2018
comment
Нет. И вы возвращаете серверное время в functions. Потратьте некоторое время, чтобы узнать об аксессорах и других функциях для laravel. Это обязательно поможет в будущем. - person thisiskelvin; 22.10.2018
comment
может создать новые данные, если это сделать, но не может рассчитать данные по той же категории public function getDailySpentTimeAttribute($value) { return $this->attributes['daily_spent_time'] = ucfirst($value); } - person Lia nur fadilah; 23.10.2018

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

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);
    }
}
person Lia nur fadilah    schedule 19.10.2018

данные есть, когда dd($spent_time);

dd($spent_time);

введите здесь описание изображения

person Lia nur fadilah    schedule 22.10.2018

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

Модель

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'));
}
person Lia nur fadilah    schedule 24.10.2018