2010-09-29 101 views
0

三個簡單的表...幫助CakePHP的模型關係

  1. Feedname(如新聞或 活動),這是RSS提要 的名字。屬於一個 Feedname
  2. 用戶
  3. 帖子,它擁有所有 職位

我想用表單輔助自動給我一個選擇框,這樣,當我加入後我可以選擇將其分配給哪個Feedname。

看起來帖子屬於Feedname和User,但我無法在我的model/.php文件中獲得belongsTo和hasMany的正確組合。顯示feedname的選擇框,但沒有任何內容。任何人都可以將我指向正確的方向嗎?

的表格看起來像這樣的時刻:

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; 

編輯 - 添加模型.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 
     ) 
    ); 
} 

編輯 - 添加SQL轉儲** ...

/posts/index.ctp:

SELECT COUNT(*)AS count FROM posts AS Post LEFT JOIN users AS User ON(Postuser_id = Userid)LEFT JOIN feednames AS Feedname ON(Postfeedname_id = Feednameid)其中1 = 1

Post SELECT。 idPosttitlePostbodyPostcreatedPostmodifiedPostuser_id,Postfeedname_idUseridUserusernameUserpasswordUsergroup_idUsercreatedUsermodifiedFeednameidFeednamenameFeednamecreatedFeednamemodified FROM posts AS Post LEFT JOIN users AS User ON(Postuser_id = Userid)LEFT JOIN feednames AS Feedname ON(Postfeedname_id = Feednameid)其中1 = 1 ORDER BY Postcreated DESC LIMIT 10

請注意: /posts/add.ctp不產生任何SQL轉儲,所以它沒有得到從數據庫中選擇框的選項,這就是我想用適當的模型來解決關係。

+0

您還可以添加模型文件嗎?你用過蛋糕烘烤嗎? – 2010-09-29 19:36:17

+0

我沒有使用蛋糕烘烤 - 我基本上從Cake Book的Blog教程中複製了精確的代碼,並添加了Feednames控制器/模型/視圖。請參閱模型文件的編輯問題。 – Owen 2010-09-29 22:11:33

回答

2

在控制器方法(例如admin_add/admin_edit函數)中是否有類似的東西?然後

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

蛋糕應自動填充這些值的選擇列表。或者您可以手動設置值:

$form->input('feedname_id', array('options' => $feednames)); 
+0

我在FeednamesController中有類似的地方,但不在PostsController中。我認爲模型.php文件關係變量應該做這項工作,而不是控制器。 – Owen 2010-09-29 22:06:45

+1

如果您希望數據(一個飼料名稱列表)顯示在您的帖子視圖中(例如admin_edit或admin_add),您需要查找數據並將其發送到視圖。如果你爲你的控制器使用Cake Bake,它會產生類似於我上面發佈的東西。嘗試一下。 – bjudson 2010-09-30 03:55:14

+0

我重新開始,用控制檯烘焙模型和控制器,發現我需要$ feednames = $ this-> Post-> Feedname-> find('list');在我的控制器中。感謝您指點我正確的方向:) – Owen 2010-09-30 07:24:27

0

到目前爲止,我同意:

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

只是檢查,但是,你有沒有實際數據插入到你的表?否則,只有您的選擇字段爲空才合乎邏輯。另外,Sql轉儲在調試模式中說了些什麼?

+0

是的,數據在表格中。對於posts/add.ctp視圖,SQL轉儲爲空 - 表示選擇框的Feednames信息未從數據庫中檢索。我編輯了這個問題以包含來自posts/index.ctp的SQL。 – Owen 2010-09-29 22:08:42