Laravel - Не удалось обновить минимальную и максимальную даты - PullRequest
0 голосов
/ 11 февраля 2020

Используя Laravel -5.8 для моего веб-приложения, у меня в контроллере есть следующий код:

public function store(StoreAppraisalGoalRequest $request)
{
    $validated = $request->validated();             
    $userCompany = Auth::user()->company_id;
    $employeeId = Auth::user()->employee_id;
    try {
        $goal = new AppraisalGoal();
        $goal->goal_type_id             = $request->goal_type_id;
        $goal->employee_id              = $employeeId;
        $goal->weighted_score           = $request->weighted_score;
        $goal->goal_title               = $request->goal_title;
        $goal->goal_description         = $request->goal_description;  

        $goal->save();       

        foreach ( $request->activity as $key => $activity){
            $startDate = Carbon::parse($request->start_date[$key]);
            $endDate = Carbon::parse($request->end_date[$key]);

            $goaldetail = new AppraisalGoalDetail();

            $goaldetail->activity                   = $request->activity[$key];  
            $goaldetail->start_date                 = $startDate ->toDateTimeString();
            $goaldetail->end_date                   = $endDate->toDateTimeString();                 
            $goaldetail->appraisal_goal_id          = $goal->id;
            $goaldetail->save();
         }

         $min_date = AppraisalGoalDetail::select('start_date')->where('appraisal_goal_id', $goal->id)->orderBy('start_date', 'asc')->first();
         $max_date = AppraisalGoalDetail::select('end_date')->where('appraisal_goal_id', $goal->id)->orderBy('end_date', 'desc')->first();


         $goal->update([
             'appraisal_start_date' => $min_date,
             'appraisal_end_date'   => $max_date
                 ]);

            Session::flash('success', 'Appraisal Goal is created successfully');
            return redirect()->route('appraisal.appraisal_goals.index');
    } catch (Exception $exception) {
            Session::flash('danger', 'Appraisal Goal creation failed!');
            return redirect()->route('appraisal.appraisal_goals.index');
    }
}

Чего я хочу добиться, так это того, чтобы после отправки я хотел, чтобы приложение выбрало минимальная дата из AppraisalGoalDetail (start_date) и максимальная дата из AppraisalGoalDetail (end_date)

Затем быстро обновите значения appraisal_start_date и appraisal_end_date в AppraisalGoal, как показано ниже:

     $goal->update([
         'appraisal_start_date' => $min_date,
         'appraisal_end_date'   => $max_date
             ]);
* найдено это не сделало обновление. Почему?

И что мне делать?

Спасибо

Ответы [ 2 ]

1 голос
/ 11 февраля 2020

$min_date и $max_date являются объектами. Вам нужно получить их атрибуты так:

$min_date = AppraisalGoalDetail::select('start_date')->where('appraisal_goal_id', $goal->id)->orderBy('start_date', 'asc')->first();
$max_date = AppraisalGoalDetail::select('end_date')->where('appraisal_goal_id', $goal->id)->orderBy('end_date', 'desc')->first();


$goal->update([
   'appraisal_start_date' => $min_date->start_date,
   'appraisal_end_date'   => $max_date->end_date
]);

И эффективный способ - использовать max() и min(), чтобы получить значение:

$min_date = AppraisalGoalDetail::where('appraisal_goal_id', $goal->id)->min('start_date');
$max_date = AppraisalGoalDetail::where('appraisal_goal_id', $goal->id)->max('end_date');

$goal->update([
   'appraisal_start_date' => $min_date,
   'appraisal_end_date'   => $max_date
]);
0 голосов
/ 11 февраля 2020
$min_date = AppraisalGoalDetail::select('start_date')->where('appraisal_goal_id', $goal->id)->orderBy('start_date', 'asc')->first();
$max_date = AppraisalGoalDetail::select('end_date')->where('appraisal_goal_id', $goal->id)->orderBy('end_date', 'desc')->first();

этот код возвращает экземпляр AppraisalGoalDetail (конечно, только с заполненным выбранным полем). Вам нужно восстановить только значение поля. Вот так

$min_date = AppraisalGoalDetail::where('appraisal_goal_id', $goal->id)->orderBy('start_date', 'asc')->value('start_date');
$max_date = AppraisalGoalDetail::where('appraisal_goal_id', $goal->id)->orderBy('end_date', 'desc')->value('end_date');

$goal->update([
    'appraisal_start_date' => $min_date,
    'appraisal_end_date'   => $max_date
]);

При использовании метода value('fieldName') он выберет только предоставленное имя поля, ограничит запрос до 1 и вернет значение поля как есть (без мутатора)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...