Помощь с CakePHP Model Relationships - PullRequest
       0

Помощь с CakePHP Model Relationships

0 голосов
/ 29 сентября 2010

Три простых стола ...

  1. Feedname (например, новости или События), которые являются названиями RSS каналы.
  2. Сообщения, которые принадлежат Feedname
  3. Пользователь, которому принадлежат все сообщений

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

Похоже, что сообщения принадлежат как Feedname, так и User, но я не могу получить правильную комбинацию serveTo и hasMany в моих файлах модели / .php. Отображается поле выбора для имени канала, но в нем ничего нет. Кто-нибудь может указать мне правильное направление?

На данный момент таблицы выглядят так:

CREATE TABLE `feednames` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `name` varchar(50) COLLATE utf8_unicode_ci DEFAULT NULL,
  `created` datetime DEFAULT NULL,
  `modified` datetime DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

CREATE TABLE `posts` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `title` varchar(50) COLLATE utf8_unicode_ci DEFAULT NULL,
  `body` text COLLATE utf8_unicode_ci,
  `created` datetime DEFAULT NULL,
  `modified` datetime DEFAULT NULL,
  `user_id` int(10) unsigned NOT NULL DEFAULT '1',
  `feedname_id` int(10) unsigned NOT NULL DEFAULT '1',
  PRIMARY KEY (`id`),
  KEY `foreign_key` (`user_id`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

CREATE TABLE `users` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `username` varchar(255) CHARACTER SET latin1 NOT NULL,
  `password` char(40) CHARACTER SET latin1 NOT NULL,
  `group_id` int(11) NOT NULL,
  `created` datetime DEFAULT NULL,
  `modified` datetime DEFAULT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `username` (`username`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

edit - добавление файлов модели .php ...

class Feedname extends AppModel {
    var $name = 'Feedname';

    var $hasMany = array(
        'Post' => array(
            'className' => 'Post',
            'foreignKey' => 'feedname_id',
            'dependent' => false
        )
    );
}

class Post extends AppModel {
    var $name = 'Post';

    var $belongsTo = array(
        'User' => array(
            'className' => 'User',
            'foreignKey' => 'user_id'
        ),
        'Feedname' => array(
            'foreignKey' => 'feedname_id'
        )
    );
}

class User extends AppModel {
    var $name = 'User';

    var $hasMany = array(
        'Post' => array(
            'className' => 'Post',
            'foreignKey' => 'user_id',
            'dependent' => false
        )
    );
}

edit - добавление дампа SQL ** ...

/ сообщений / index.ctp:

ВЫБРАТЬ СЧЕТ (*) КАК count ОТ posts КАК Post ВЛЕВО СОЕДИНЯЕТСЯ users КАК User ВКЛ (Post. user_id = User. id) ВЛЕВО СОЕДИНИТЬСЯ feednames AS Feedname ON (Post. feedname_id = Feedname. id) WHERE 1 = 1

SELECT Post. id, Post. title, Post. body, Post. created, Post. modified, Post. user_id, Post. feedname_id, User. id, User. username, User. password, User. group_id, User. created, User. modified, Feedname. id, Feedname. name, Feedname. created, Feedname. modified ОТ posts КАК Post ВЛЕВО СОЕДИНЯЕТСЯ users AS User ВКЛ (Post. user_id = User. id) СЛЕДУЮЩЕЕ СОЕДИНЕНИЕ feednames AS Feedname ВКЛ (Post. feedname_id = Feedname. id ) ГДЕ 1 = 1 ЗАКАЗАТЬ ПО Post. created DESC LIMIT 10

Обратите внимание: /posts/add.ctp не создает дамп SQL, поэтому он не получает параметры поля выбора из базы данных, это то, что я пытаюсь исправить с помощью правильных отношений модели .

Ответы [ 2 ]

2 голосов
/ 29 сентября 2010

Есть ли у вас что-то подобное в ваших методах контроллера (например, функции admin_add / admin_edit)?

$feednames = $this->Feedname->find('list');
$this->set('feednames', $feednames);

Cake должен автоматически заполнить список выбора этими значениями. Или вы можете вручную установить значения с помощью:

$form->input('feedname_id', array('options' => $feednames));
0 голосов
/ 29 сентября 2010

Пока я согласен:

posts     > belongs to > users
posts     > belongs to > feednames
feednames > has many   > posts
users     > has many   > posts

Просто проверяю, но вы действительно вставляли данные в свои таблицы? В противном случае было бы только логично, что ваше поле выбора пусто. Кроме того, что говорит дамп Sql в режиме отладки?

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