Вопросы о членстве в ассоциации в CakePHP 3 - PullRequest
0 голосов
/ 29 апреля 2018

Мне нужна помощь для модели приложения моего расписания ...

Что я хочу сделать, это приложение, которое позволяет вам экономить время на каждый день.

Я построил эту модель:

enter image description here

Примечание: Я добавил отношение hasMany из расписания к модели timesheets_tasks, потому что мне не удалось получить доступ к таблице дней другим способом

В конце я не уверен, что принадлежность ToMany от расписаний к задачам действительно подходит в этой ситуации…

У меня есть 2 вопроса:

Эта модель звучит хорошо для вас? Как сэкономить дни? Потому что когда я сохраняю это:

object(App\Model\Entity\Timesheet) {

    'id' => (int) 2,
    'user_id' => (int) 1,
    'week_nb' => (int) 16,
    'year' => (int) 2018,
    'validated' => false,
    'created' => object(Cake\I18n\FrozenTime) {

        'time' => '2018-04-02T09:25:29+00:00',
        'timezone' => 'UTC',
        'fixedNowTime' => false

    },
    'modified' => object(Cake\I18n\FrozenTime) {

        'time' => '2018-04-28T22:17:29+00:00',
        'timezone' => 'UTC',
        'fixedNowTime' => false

    },
    'tasks' => [
        (int) 0 => object(App\Model\Entity\Task) {

            'id' => (int) 1,
            'name' => 'Atelier 1 - Compta',
            'scope' => 'global',
            'user_id' => null,
            'project_id' => (int) 1,
            'created' => object(Cake\I18n\FrozenTime) {

                'time' => '2018-04-01T15:19:44+00:00',
                'timezone' => 'UTC',
                'fixedNowTime' => false

            },
            'modified' => object(Cake\I18n\FrozenTime) {

                'time' => '2018-04-01T15:19:44+00:00',
                'timezone' => 'UTC',
                'fixedNowTime' => false

            },
            '[new]' => false,
            '[accessible]' => [
                '*' => true
            ],
            '[dirty]' => [],
            '[original]' => [],
            '[virtual]' => [],
            '[errors]' => [],
            '[invalid]' => [],
            '[repository]' => 'Tasks'

        },
        (int) 1 => object(App\Model\Entity\Task) {

            'id' => (int) 2,
            'name' => 'Atelier 2 - Achats',
            'scope' => 'global',
            'user_id' => null,
            'project_id' => (int) 1,
            'created' => object(Cake\I18n\FrozenTime) {

                'time' => '2018-04-01T15:20:13+00:00',
                'timezone' => 'UTC',
                'fixedNowTime' => false

            },
            'modified' => object(Cake\I18n\FrozenTime) {

                'time' => '2018-04-01T15:20:13+00:00',
                'timezone' => 'UTC',
                'fixedNowTime' => false

            },
            '[new]' => false,
            '[accessible]' => [
                '*' => true
            ],
            '[dirty]' => [],
            '[original]' => [],
            '[virtual]' => [],
            '[errors]' => [],
            '[invalid]' => [],
            '[repository]' => 'Tasks'

        }
    ],
    'timesheets_tasks' => [
        (int) 0 => object(App\Model\Entity\TimesheetsTask) {

            'id' => (int) 13,
            'timesheet_id' => (int) 2,
            'task_id' => (int) 1,
            'created' => object(Cake\I18n\FrozenTime) {

                'time' => '2018-04-28T22:04:45+00:00',
                'timezone' => 'UTC',
                'fixedNowTime' => false

            },
            'modified' => object(Cake\I18n\FrozenTime) {

                'time' => '2018-04-28T22:04:45+00:00',
                'timezone' => 'UTC',
                'fixedNowTime' => false

            },
            'days' => [
                (int) 0 => object(App\Model\Entity\Day) {

                    'date' => object(DateTime) {
                        date => '2018-04-16 22:17:40.643236'
                        timezone_type => (int) 3
                        timezone => 'UTC'
                    },
                    '[new]' => true,
                    '[accessible]' => [
                        '*' => true
                    ],
                    '[dirty]' => [
                        'date' => true
                    ],
                    '[original]' => [],
                    '[virtual]' => [],
                    '[errors]' => [],
                    '[invalid]' => [],
                    '[repository]' => 'Days'

                },
                (int) 1 => object(App\Model\Entity\Day) {

                    'date' => object(DateTime) {
                        date => '2018-04-17 22:17:40.647586'
                        timezone_type => (int) 3
                        timezone => 'UTC'
                    },
                    '[new]' => true,
                    '[accessible]' => [
                        '*' => true
                    ],
                    '[dirty]' => [
                        'date' => true
                    ],
                    '[original]' => [],
                    '[virtual]' => [],
                    '[errors]' => [],
                    '[invalid]' => [],
                    '[repository]' => 'Days'

                },
                (int) 2 => object(App\Model\Entity\Day) {

                    'date' => object(DateTime) {
                        date => '2018-04-18 22:17:40.647655'
                        timezone_type => (int) 3
                        timezone => 'UTC'
                    },
                    '[new]' => true,
                    '[accessible]' => [
                        '*' => true
                    ],
                    '[dirty]' => [
                        'date' => true
                    ],
                    '[original]' => [],
                    '[virtual]' => [],
                    '[errors]' => [],
                    '[invalid]' => [],
                    '[repository]' => 'Days'

                },
                (int) 3 => object(App\Model\Entity\Day) {

                    'date' => object(DateTime) {
                        date => '2018-04-19 22:17:40.647705'
                        timezone_type => (int) 3
                        timezone => 'UTC'
                    },
                    '[new]' => true,
                    '[accessible]' => [
                        '*' => true
                    ],
                    '[dirty]' => [
                        'date' => true
                    ],
                    '[original]' => [],
                    '[virtual]' => [],
                    '[errors]' => [],
                    '[invalid]' => [],
                    '[repository]' => 'Days'

                },
                (int) 4 => object(App\Model\Entity\Day) {

                    'date' => object(DateTime) {
                        date => '2018-04-20 22:17:40.647754'
                        timezone_type => (int) 3
                        timezone => 'UTC'
                    },
                    '[new]' => true,
                    '[accessible]' => [
                        '*' => true
                    ],
                    '[dirty]' => [
                        'date' => true
                    ],
                    '[original]' => [],
                    '[virtual]' => [],
                    '[errors]' => [],
                    '[invalid]' => [],
                    '[repository]' => 'Days'

                },
                (int) 5 => object(App\Model\Entity\Day) {

                    'date' => object(DateTime) {
                        date => '2018-04-21 22:17:40.647796'
                        timezone_type => (int) 3
                        timezone => 'UTC'
                    },
                    '[new]' => true,
                    '[accessible]' => [
                        '*' => true
                    ],
                    '[dirty]' => [
                        'date' => true
                    ],
                    '[original]' => [],
                    '[virtual]' => [],
                    '[errors]' => [],
                    '[invalid]' => [],
                    '[repository]' => 'Days'

                },
                (int) 6 => object(App\Model\Entity\Day) {

                    'date' => object(DateTime) {
                        date => '2018-04-22 22:17:40.647838'
                        timezone_type => (int) 3
                        timezone => 'UTC'
                    },
                    '[new]' => true,
                    '[accessible]' => [
                        '*' => true
                    ],
                    '[dirty]' => [
                        'date' => true
                    ],
                    '[original]' => [],
                    '[virtual]' => [],
                    '[errors]' => [],
                    '[invalid]' => [],
                    '[repository]' => 'Days'

                }
            ],
            '[new]' => false,
            '[accessible]' => [
                '*' => true
            ],
            '[dirty]' => [
                'days' => true
            ],
            '[original]' => [
                'days' => []
            ],
            '[virtual]' => [],
            '[errors]' => [],
            '[invalid]' => [],
            '[repository]' => 'TimesheetsTasks'

        }
    ],
    '[new]' => false,
    '[accessible]' => [
        '*' => true
    ],
    '[dirty]' => [
        'tasks' => true
    ],
    '[original]' => [
        'tasks' => [
            (int) 0 => object(App\Model\Entity\Task) {

                'id' => (int) 1,
                'name' => 'Atelier 1 - Compta',
                'scope' => 'global',
                'user_id' => null,
                'project_id' => (int) 1,
                'created' => object(Cake\I18n\FrozenTime) {

                    'time' => '2018-04-01T15:19:44+00:00',
                    'timezone' => 'UTC',
                    'fixedNowTime' => false

                },
                'modified' => object(Cake\I18n\FrozenTime) {

                    'time' => '2018-04-01T15:19:44+00:00',
                    'timezone' => 'UTC',
                    'fixedNowTime' => false

                },
                '_joinData' => object(App\Model\Entity\TimesheetsTask) {

                    'id' => (int) 13,
                    'timesheet_id' => (int) 2,
                    'task_id' => (int) 1,
                    'created' => object(Cake\I18n\FrozenTime) {

                        'time' => '2018-04-28T22:04:45+00:00',
                        'timezone' => 'UTC',
                        'fixedNowTime' => false

                    },
                    'modified' => object(Cake\I18n\FrozenTime) {

                        'time' => '2018-04-28T22:04:45+00:00',
                        'timezone' => 'UTC',
                        'fixedNowTime' => false

                    },
                    '[new]' => false,
                    '[accessible]' => [
                        '*' => true
                    ],
                    '[dirty]' => [],
                    '[original]' => [],
                    '[virtual]' => [],
                    '[errors]' => [],
                    '[invalid]' => [],
                    '[repository]' => 'TimesheetsTasks'

                },
                '[new]' => false,
                '[accessible]' => [
                    '*' => true
                ],
                '[dirty]' => [],
                '[original]' => [],
                '[virtual]' => [],
                '[errors]' => [],
                '[invalid]' => [],
                '[repository]' => 'Tasks'

            }
        ]
    ],
    '[virtual]' => [],
    '[errors]' => [],
    '[invalid]' => [],
    '[repository]' => 'Timesheets'

}

Я не спасаю дни ... Контроллер:

public function add()
{
    $timesheet = $this->Timesheets->newEntity();
    if ($this->request->is(['patch', 'post', 'put'])) {
        if(!is_null($this->request->getData('id'))) {
            $timesheet = $this->Timesheets->get($this->request->getData('id'), ['contain' => ['TimesheetsTasks' => ['Days'], 'Tasks']]);
        }

        // Here I "create" 7 days entities if a new timesheet_task has been added
        $this->initEmptyTasks($timesheet);

        $timesheet = $this->Timesheets->patchEntity($timesheet, $this->request->getData(), ['associated' => ['TimesheetsTasks' => ['associated' => ['Days']], 'Tasks']]);

        if ($result = $this->Timesheets->save($timesheet)) {
            $this->Flash->success(__('The timesheet has been saved.'));
            return $this->redirect($this->referer());
        }
        $this->Flash->error(__('The timesheet could not be saved. Please, try again.'));
        return $this->redirect($this->referer());
    }
    $users = $this->Timesheets->Users->find('list', ['limit' => 200]);
    $this->set(compact('timesheet', 'users'));
}

У меня нет ошибок, но дни не сохраняются ...

Заранее спасибо за помощь.

1 Ответ

0 голосов
/ 01 мая 2018

Боже мой, я нашел основную причину ...

Я изменял сущность вместо данных, которые я исправлял сущностью с помощью ...

Но теперь у меня есть один вопрос:

Можете ли вы иметь сводную таблицу BTM, чтобы иметь отношение hasMany к другой таблице?

Поскольку я могу сохранить _joinData для дополнительного поля (поле комментария здесь), но не для отношения hasMany (таблица дней)

Вот мои $ данные, прежде чем я вызову метод patchEntity:

[
    'id' => '2',
    'week_nb' => '16',
    'year' => '2018',
    'tasks' => [
        (int) 0 => [
            'id' => (int) 1,
            '_joinData' => [
                'comment' => 'Hihi tache 1 new',
                'days' => [
                    (int) 0 => [
                        'timesheet_task_id' => (int) 35,
                        'ts_date' => object(DateTime) {
                            date => '2018-04-16 19:04:45.150726'
                            timezone_type => (int) 3
                            timezone => 'Europe/Paris'
                        }
                    ]
                ]
            ]
        ],
        (int) 1 => [
            'id' => (int) 2,
            '_joinData' => [
                'comment' => 'Hihi tache 2'
            ]
        ]
    ]
] 

Вот мои данные после вызова метода patchEntity:

$timesheet = $this->Timesheets->patchEntity($timesheet, $data, ['associated' => ['Tasks._joinData.Days']]);

Часть _joinData:

'_joinData' => object(App\Model\Entity\TimesheetsTask) {

    'id' => (int) 35,
    'timesheet_id' => (int) 2,
    'task_id' => (int) 1,
    'comment' => 'Hihi tache 1 new',
    'created' => object(Cake\I18n\FrozenTime) {

        'time' => '2018-05-01T18:39:17+02:00',
        'timezone' => 'Europe/Paris',
        'fixedNowTime' => false

    },
    'modified' => object(Cake\I18n\FrozenTime) {

        'time' => '2018-05-01T18:58:55+02:00',
        'timezone' => 'Europe/Paris',
        'fixedNowTime' => false

    },
    'days' => [
        (int) 0 => object(App\Model\Entity\Day) {

            'timesheet_task_id' => (int) 35,
            'ts_date' => object(DateTime) {
                date => '2018-04-16 19:02:01.023189'
                timezone_type => (int) 3
                timezone => 'Europe/Paris'
            },
            '[new]' => true,
            '[accessible]' => [
                '*' => true
            ],
            '[dirty]' => [
                'timesheet_task_id' => true,
                'ts_date' => true
            ],
            '[original]' => [],
            '[virtual]' => [],
            '[errors]' => [],
            '[invalid]' => [],
            '[repository]' => 'Days'

        }
    ],
    '[new]' => false,
    '[accessible]' => [
        '*' => true
    ],
    '[dirty]' => [
        'days' => true
    ],
    '[original]' => [],
    '[virtual]' => [],
    '[errors]' => [],
    '[invalid]' => [],
    '[repository]' => 'TimesheetsTasks'

},

Это похоже на то, как cakePHP преобразует мою дневную запись в дневную сущность, но теперь тот же результат, но не экономит.

...