Доступ к CakePHP косвенно связанной модели - вопрос новичка - PullRequest
0 голосов
/ 25 апреля 2010

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

и погуглил, сколько я стою, поэтому я предполагаю, что упускаю что-то очевидное!

Каждый «элемент журнала» принадлежит «подпроекту», который, в свою очередь, принадлежит «проекту», который, в свою очередь, принадлежит «субклиенту», который в конечном итоге принадлежит клиенту. Вот 5 таблиц MySQL, которые я использую:

mysql> DESCRIBE log_items;
+-----------------+--------------+------+-----+---------+----------------+
| Field           | Type         | Null | Key | Default | Extra          |
+-----------------+--------------+------+-----+---------+----------------+
| id              | int(11)      | NO   | PRI | NULL    | auto_increment |
| date            | date         | NO   |     | NULL    |                |
| time            | time         | NO   |     | NULL    |                |
| time_spent      | int(11)      | NO   |     | NULL    |                |
| sub_projects_id | int(11)      | NO   | MUL | NULL    |                |
| title           | varchar(100) | NO   |     | NULL    |                |
| description     | text         | YES  |     | NULL    |                |
| created         | datetime     | YES  |     | NULL    |                |
| modified        | datetime     | YES  |     | NULL    |                |
+-----------------+--------------+------+-----+---------+----------------+


mysql> DESCRIBE sub_projects;
+-------------+--------------+------+-----+---------+----------------+
| Field       | Type         | Null | Key | Default | Extra          |
+-------------+--------------+------+-----+---------+----------------+
| id          | int(11)      | NO   | PRI | NULL    | auto_increment |
| name        | varchar(100) | NO   |     | NULL    |                |
| projects_id | int(11)      | NO   | MUL | NULL    |                |
| created     | datetime     | YES  |     | NULL    |                |
| modified    | datetime     | YES  |     | NULL    |                |
+-------------+--------------+------+-----+---------+----------------+


mysql> DESCRIBE projects;
+----------------+--------------+------+-----+---------+----------------+
| Field          | Type         | Null | Key | Default | Extra          |
+----------------+--------------+------+-----+---------+----------------+
| id             | int(11)      | NO   | PRI | NULL    | auto_increment |
| name           | varchar(100) | NO   |     | NULL    |                |
| sub_clients_id | int(11)      | NO   | MUL | NULL    |                |
| created        | datetime     | YES  |     | NULL    |                |
| modified       | datetime     | YES  |     | NULL    |                |
+----------------+--------------+------+-----+---------+----------------+


mysql> DESCRIBE sub_clients;
+------------+--------------+------+-----+---------+----------------+
| Field      | Type         | Null | Key | Default | Extra          |
+------------+--------------+------+-----+---------+----------------+
| id         | int(11)      | NO   | PRI | NULL    | auto_increment |
| name       | varchar(100) | NO   |     | NULL    |                |
| clients_id | int(11)      | NO   | MUL | NULL    |                |
| created    | datetime     | YES  |     | NULL    |                |
| modified   | datetime     | YES  |     | NULL    |                |
+------------+--------------+------+-----+---------+----------------+


mysql> DESCRIBE clients;
+----------+--------------+------+-----+---------+----------------+
| Field    | Type         | Null | Key | Default | Extra          |
+----------+--------------+------+-----+---------+----------------+
| id       | int(11)      | NO   | PRI | NULL    | auto_increment |
| name     | varchar(100) | NO   |     | NULL    |                |
| created  | datetime     | YES  |     | NULL    |                |
| modified | datetime     | YES  |     | NULL    |                |
+----------+--------------+------+-----+---------+----------------+

Я установил следующие ассоциации в CakePHP:

LogItem belongsTo SubProjects
SubProject belongsTo Projects
Project belongsTo SubClients
SubClient belongsTo Clients

Client hasMany SubClients
SubClient hasMany Projects
Project hasMany SubProjects
SubProject hasMany LogItems

Используя «торт-пирог», я создал модели, контроллеры (индекс, представление, добавление, редактирование и удаление) и представления, и все, похоже, функционирует - как в случае, когда я могу успешно выполнять простые операции CRUD.

Вопрос

При редактировании «элемента журнала» на www.mydomain / log_items / edit мне предоставляется представление, которое вы все подозреваете; а именно столбцы таблицы log_items с соответствующими текстовыми полями / полями выбора и т. д. Я также хотел бы включить поля выбора для выбора клиента, субклиента, проекта и подпроекта в представлении редактирования 'log_items'.

В идеале поле выбора «субклиент» должно заполняться в зависимости от выбранного «клиента», поле выбора «проект» также должно заполняться в зависимости от выбранного «субклиента» и т. Д. И т. Д.

Я предполагаю, что способ заполнить поля выбора соответствующими параметрами - это Ajax, но я не уверен, как на самом деле получить доступ к модели из дочернего представления косвенно связанной модели, например, как создать ' поле выбора субклиента в окне редактирования 'log_items'.

Я нашел этот пример:

http://forum.phpsitesolutions.com/php-frameworks/cakephp/ajax-cakephp-dynamically-populate-html-select-dropdown-box-t29.html

где кто-то достигает чего-то подобного для штатов, округов и городов США. Тем не менее, я заметил в схеме базы данных - которую можно загрузить с сайта выше по ссылке - что таблицы базы данных не имеют каких-либо внешних ключей, поэтому теперь мне интересно, правильно ли я поступаю.

Буду очень признателен за любые указания и советы.

С уважением,

Chris

1 Ответ

0 голосов
/ 25 апреля 2010

Ваши имена внешних ключей должны быть в единственном числе. Таким образом, projects_id должен быть project_id, а sub_projects_id должен быть sub_project_id и так далее. Если вы используете торт или строительные леса, у вас не должно быть возможности редактировать связанные данные на каждой странице редактирования модели. В качестве примечания, убедитесь, что все созданные вами классы моделей единичны (в /models/folder).

Чтобы редактировать несколько уровней ассоциации, это может быть так же просто, как установить для элемента $ recursive класса значение 2 в каждой из моделей, где вы хотите, чтобы страница редактирования имела несколько уровней ассоциации. Дайте мне знать, как это работает для вас.

В ответ на ваш второй вопрос.

Убедитесь, что ваши модели имеют все необходимые ассоциации. Если вы испекли их, они должны включить их, но, учитывая вашу ошибку, похоже, что они почему-то не были включены. Так что в log_item.php у вас должно быть что-то вроде

var $belongsTo = array('SubProject');

...