Be part of JetBrains PHPverse 2026 on June 9 – a free online event bringing PHP devs worldwide together.

skryptoxy's avatar

DateTime::__construct(): Argument #1 ($datetime) must be of type string, array given

I have next input :

<div class="form-group">
                {{ Form::label('start_at', trans('admin.date_start'), ['class' => 'col-sm-3 control-label no-padding-right']) }}
                <div class="col-sm-8">
                    <div class="input-group">
                        <input type="text" name="start_at[]" id="start_at" class="form-control date-picker"
                               data-date-format="DD.MM.Y HH:mm"
                               value="{{ isset($data) ? $data->start_at->format('d.m.Y H:i') : old('start_at', now()->format('d.m.Y H:i')) }}" />
                    </div>
                </div>
            </div>

And method in controller :

public function store(StoreLessonRequest $request)
    {
        $dates = [];
        $dates[] = $request->start_at;

        for ($date = 2; $date <= Lesson::MAX_LESSONS_DATE; $date++) {
            $start_at = $request->input("start_at_$date");
           
            if (!empty($start_at)) { $dates[] = $start_at; }
        }

        foreach ($dates as $start_at) {
            $lessonData = $request->validated();
            $start_at = Carbon::parse($request->start_date);
            $lessonData['start_at'] = $start_at;

            $lesson = Lesson::create($lessonData);

            $lesson->students()->sync($request->get('students'));
        }

        $totalLessons = count($dates);
        return redirect()->route('admin.lessons.index');
    }

How to fix that error : DateTime::__construct(): Argument #1 ($datetime) must be of type string, array given

0 likes
10 replies
tykus's avatar

Where does the error originate; which line in your code? Also, what does the data in $request->validated() look like?

skryptoxy's avatar

@tykus

public function rules()
    {
        return [
            'format_id' => 'required|integer',
            'teacher_id' => 'required|integer',
            'grade_id' => 'required|integer',
            'subject_id' => 'required|integer',
            'goal_id' => 'required|integer',
            'status_id' => 'required|integer',
            'description' => 'string|nullable',
            'link' => 'string',
            'link_registered' => 'string|nullable',
            'start_at' => 'date',
            'duration' => 'integer',
        ];
    }

    /**
     * Configure the validator instance.
     *
     * @param  \Illuminate\Validation\Validator  $validator
     * @return void
     */
    public function withValidator($validator)
    {
        $validator->after(function ($validator) {

            $startAt = Carbon::parse(request()->get('start_at'));

            $endAt = $startAt->copy()->addMinutes(request()->get('duration') - 1);

            $userId = request()->get('teacher_id');

            $slotService = new SlotService();

            $id = ! empty($this->route('lesson')) ? $this->route('lesson')->id : null;

            if ($slotService->getTeacherLessons($userId, $startAt, $endAt, $id)->count() > 0) {
                $validator->errors()->add('teacher_id', 'У данного учителя в этот период уже запланирован урок');
            }

            if (! $slotService->checkSlotIsAvailable($userId, $startAt, $endAt)) {
                $validator->errors()->add('teacher_id', 'У данного учителя в этот период нет свободных часов');
            }

        });
    }
tykus's avatar

@skryptoxy and...

Where does the error originate; which line in your code?

Can you share the stacktrace?

skryptoxy's avatar

@tykus

: 87 __construct :
 parent::__construct($time ?: 'now', static::safeCreateDateTimeZone($tz) ?: null);
skryptoxy's avatar

@tykus I got it, but how I can pass a string in Carbon::parse ?

I tried that :

 foreach (request()->get('start_at') as $startAtString) {
                $startAt = Carbon::parse($startAtString);

and it giving next error

htmlspecialchars(): Argument #1 ($string) must be of type string, array given

tykus's avatar

@skryptoxy you are probably trying to output the start_at value in a Blade template.

skryptoxy's avatar

@tykus Yeah, there is it :

<div class="form-group">
                {{ Form::label('start_at', trans('admin.date_start'), ['class' => 'col-sm-3 control-label no-padding-right']) }}
                <div class="col-sm-8">
                    <div class="input-group">
                        <input type="text" name="start_at[]" id="start_at" class="form-control date-picker"
                               data-date-format="DD.MM.Y HH:mm"
                               value="{{ isset($data) ? $data->start_at->format('d.m.Y H:i') : old('start_at', now()->format('d.m.Y H:i')) }}" />
                    </div>
                </div>
            </div>

but I need it, how I can fix it?

Please or to participate in this conversation.