Добавление задачи пользователю

Файл Task

 <?
public function project()
    {
        return $this->belongsTo(Project::class, 'project_id', 'id');
    }

    public function owner()
    {
        return $this->belongsTo(User::class, 'user_id', 'id');
    }

Код файла show.blade.php

  @foreach($project->tasks as $key => $task)
                                    <tr>
                                        <td>{{ $task->owner->full_name }}</td>
                                        <td>{{ $task->descriptions }}</td>
                                        <td>Файлы и склад</td>
                                        <td><input type="checkbox">Готов</td>
                                    </tr>
                                    <tr>
                                        <td>{{ $task->owner->full_name }}</td>
                                        <td>{{ $task->descriptions1 }}</td>

                                        <td>Файлы и склад</td>
                                        <td><input type="checkbox">Готов</td>
                                    </tr>
                                    <tr>
                                        <td>{{ $task->owner->full_name }}</td>
                                        <td>{{ $task->descriptions2 }}</td>
                                        <td>Файлы и склад</td>
                                        <td><input type="checkbox">Готов</td>
                                    </tr>
                                    <tr>
                                        <td>{{ $task->owner->full_name }}</td>
                                        <td>{{ $task->descriptions3 }}</td>
                                        
                                        <td>Файлы и склад</td>
                                        <td><input type="checkbox">Готов</td>
                                    </tr>
                                    @endforeach

Данный код выводит информацию о поставленных задач пользователю, но сделано все так что у меня на пользователя может максимально создаваться 15 задач, так как descriptions ячеек в таблице 15 штук.


Возможно ли сделать так чтобы очитстить базу от статического кол-ва задач, и ставить их неограниченное число.

Вот сам форма добавления задачи

 html = '<div class="card col-3 task" data-id="'+data.id+'">\n' +
                        '   <div class="card-body">\n' +
                        '       <h5 class="card-title">'+data.text.split(' - ')[0]+'</h5>\n' +
                        '       <h6 class="card-subtitle mb-2 text-muted">'+data.text.split(' - ')[1]+'</h6>\n' +
                        '       <div class="form-group">\n' +
                        '         <label for="task-description">Задача</label>\n' +
                        '         <textarea id="task-description" class="card-text form-control" name="descriptions['+data.id+']"></textarea>\n' +
                        '       </div>\n' +
                        '       <div class="form-group">\n' +
                        '         <label for="task-start-date">Start Date</label>\n' +
                        '         <input id="task-start-date" type="date" class="form-control" name="start_dates['+data.id+']">\n' +
                        '       </div>\n' +
                        '       <div class="form-group">\n' +
                        '          <label for="task-end-date">End Date</label>\n' +
                        '          <input id="task-end-date" type="date" class="form-control" name="end_dates['+data.id+']">\n' +
                        '       </div>\n' +
                        '    </div>\n' +
                        '</div>';

                    tasksSection.append(html);

Код из контроллера

foreach ($users as $user) {
                Task::query()
                    ->create([
                        'descriptions' => $descriptions[$user],
                        'descriptions1' => $descriptions1[$user],
                        'descriptions2' => $descriptions2[$user],
                        'descriptions3' => $descriptions3[$user],
                        'descriptions4' => $descriptions4[$user],
                        'descriptions5' => $descriptions5[$user],
                        'descriptions6' => $descriptions6[$user],
                        'descriptions7' => $descriptions7[$user],
                        'descriptions8' => $descriptions8[$user],
                        'descriptions9' => $descriptions9[$user],
                        'descriptions10' => $descriptions10[$user],
                        'descriptions11' => $descriptions11[$user],
                        'descriptions12' => $descriptions12[$user],
                        'descriptions13' => $descriptions13[$user],
                        'descriptions14' => $descriptions14[$user],
                        'start_date' => $tartDates[$user],
                        'end_date' => $endDates[$user],
                        'user_id' => $user,
                        'project_id' => $project->id
                    ]);

Получается что я задачу когда ставлю ,в поле name выводиться следующий код

name="descriptions[5]"

в кв. скобках 5 принимает ID пользователя.

Выводить информацию таким образом будет не удобно да и как по мне не правильно (хотя я и не есть какой программист). Как правильно вывести данную информацию, не размножая код на 15 строк.

Код добавления задачи для пользователя

   let selectBox = $('.js-example-basic-multiple'),
                tasksSection = $('.tasks-section .tasks');

            selectBox.select2();


            selectBox.on('select2:select', function (e) {
                let data = e.params.data,
                    html = '';

                    html = '<div class="card col-3 task" data-id="'+data.id+'">\n' +
                        '   <div class="card-body">\n' +
                        '       <h5 class="card-title">'+data.text.split(' - ')[0]+'</h5>\n' +
                        '       <h6 class="card-subtitle mb-2 text-muted">'+data.text.split(' - ')[1]+'</h6>\n' +
                        '       <div class="form-group">\n' +
                        '         <div class="task-box"><label for="task-description">Задача 1</label>\n' +
                        '           <textarea id="task-description" class="card-text form-control" name="descriptions['+data.id+']"></textarea></div>\n' +
                         '       <button type="button" class="mt-2 task-btn btn btn-success btn-sm"><i class="fas fa-plus-circle"></i>&nbsp;&nbsp;Добавить</button></div>\n' +
                        '       </div>\n' +
                         '       <div class="form-group">\n' +
                         '         <label for="task-start-date">Start Date</label>\n' +
                         '         <input id="task-start-date" type="date" class="form-control" name="start_dates['+data.id+']">\n' +
                         '       </div>\n' +
                        '       <div class="form-group">\n' +
                        '          <label for="task-end-date">End Date</label>\n' +
                        '          <input id="task-end-date" type="date" class="form-control" name="end_dates['+data.id+']">\n' +
                        '       </div>\n' +
                        '    </div>\n' +
                        '</div>';

                    tasksSection.append(html);



                
            });

Сделал сейчас вот такую форму.

 @foreach($project->$users as $user)
                                <form method="POST" action="/project/{{ $project->id }}/showQuest">
                                    {{ csrf_field() }}
                                    <div class="form-group">
                                      <label for="inputUser">Выбор пользователя</label>
                                      <select id="inputUser" class="form-control">
                                        <option selected>--- Список с пользователями в нутри ---</option>
                                        <option>Вания</option>
                                      </select>
                                    </div>
                                    <div class="form-group">
                                        <lable name="description">Задача пользователю</lable>
                                        <textarea class="form-control" rows="5" name="description" cols="50"></textarea>
                                    </div>
                                    <div class="form-group row">
                                        <input class="form-control " type="date">
                                            <div class="mx-auto">До</div>
                                        <input class="form-control " type="date">
                                    </div>
                                </form>
                                @endforeach    

Попытался вывести данные : Результат нулевой. Далее сообразил что не написан контроллер для данной задачи.

Добавил код в ProjectController@show ()

$project = Project::query()
            ->with('owners')
            ->with('tasks')
            ->with('safes')
            ->findOrFail($id);
        $files = $project->files;

        $users = $request->get('users');
        $descriptions = $request->get('descriptions');
        $startDates = $request->get('start_dates');
        $endDates = $request->get('end_dates');
        $newSafeName = $request->get('new_safe_name');
        $newSafeType = $request->get('new_safe_type');
        $newSafeCount = $request->get('new_safe_count');
        $newSafeUse = $request->get('new_safe_use');

        if ($users) {
            $project->owners()->attach($users);

            foreach ($users as $user) {
                Task::query()
                    ->create([
                        'descriptions' => $descriptions[$user],
                        'start_date' => $startDates[$user],
                        'end_date' => $endDates[$user],
                        'user_id' => $user,
                        'project_id' => $project->id
                    ]);
            }
        }

результат тот же, ошибка users as users. Подумав решил вызвать route:list в нем show изначально не мог иметь POST | PUT, только GET | HEAD . И что то я теперь не могу сообразить , если у меня эта форма находится в админке, и мне необходимо из Админки при просмотре проекта ставить задачу, то как мне это правильно сделать ? Но как это сделать ?


Ответы (1 шт):

Автор решения: Максим Степанов

По хорошему нужно изменить структуру таблицы task в БД. Я правильно понял, что у вас в таблице 15 полей (столбцов) с именами descriptions, descriptions1, ... descriptions15? Зачем 15 ячеек для однотипных данных. Более того, такая структура привела Вас к текущей проблеме - нельзя хранить более 15 задач на пользователя.

Если сделать по-человечески, то структура может быть такой:

id  |  user_id  |  project_id  |  description_name  |  start_date  |  end_date

Для каждой задачи пользователя - новая запись в эту таблицу. Таким образом у вас: 1) не будет храниться пустых значений для пользователей, у которых менее 15 задач, 2) не будет ограничений по количеству задач на пользователя.

→ Ссылка