Cakephp 2.2.3 habtm 保存到中间表
Posted
技术标签:
【中文标题】Cakephp 2.2.3 habtm 保存到中间表【英文标题】:Cakephp 2.2.3 habtm saving to intermediary table 【发布时间】:2012-12-07 19:41:29 【问题描述】:好的,所以对于我在 Cakephp 2.2.3 中的项目,我设置了我的数据库和控制器并烘焙了所有内容。我仔细检查了所有内容,并且一切正常(添加、编辑、删除)。我无法工作的一件事是保存到users
表和websites
表之间的中间表。中间表是user_websites
。 user_websites
表只有 3 个字段:id
、user_id
和 website_id
。
当我以注册用户身份登录并进入网站添加页面时,我可以添加网站没有问题,但它只保存到websites
表中,user_websites
表中没有任何内容。摆弄WebsitesController
中的add 函数,我可以将website_id
保存在user_websites
表中,但同样,user_id
什么也没有。显然,我需要发生的是,在添加新网站时,它应该将该记录保存到 websites
表中,并使用当前登录用户的 id 和 website_id
将记录添加到 user_websites
表中刚刚得救了。任何帮助,将不胜感激。谢谢!
这是我的代码:
用户模型
public $hasMany = array(
'UserWebsite' => array(
'className' => 'UserWebsite',
'foreignKey' => 'user_id',
'dependent' => false,
'conditions' => '',
'fields' => '',
'order' => '',
'limit' => '',
'offset' => '',
'exclusive' => '',
'finderQuery' => '',
'counterQuery' => ''
)
);
网站模型
public $hasMany = array(
'UserWebsite' => array(
'className' => 'UserWebsite',
'foreignKey' => 'user_id',
'dependent' => false,
'conditions' => '',
'fields' => '',
'order' => '',
'limit' => '',
'offset' => '',
'exclusive' => '',
'finderQuery' => '',
'counterQuery' => ''
)
);
public $hasAndBelongsToMany = array(
'User' => array(
'className' => 'User',
'joinTable' => 'users_websites',
'foreignKey' => 'website_id',
'associationForeignKey' => 'user_id',
'unique' => 'keepExisting',
'conditions' => '',
'fields' => '',
'order' => '',
'limit' => '',
'offset' => '',
'finderQuery' => '',
'deleteQuery' => '',
'insertQuery' => ''
)
);
用户网站模型
public $belongsTo = array(
'User' => array(
'className' => 'User',
'foreignKey' => 'user_id',
'conditions' => '',
'fields' => '',
'order' => ''
),
'Website' => array(
'className' => 'Website',
'foreignKey' => 'website_id',
'conditions' => '',
'fields' => '',
'order' => ''
)
);
网站控制器
public function add()
if ($this->request->is('post'))
$this->Website->create();
if ($this->Website->UserWebsite->saveAll($this->request->data, array('deep' => true)))
$log = $this->Website->getDataSource()->getLog(false, false);
debug($log);
$this->Session->setFlash(__('The website has been saved'));
$this->redirect(array('action' => 'index'));
else
$this->Session->setFlash(__('The website could not be saved. Please, try again.'));
【问题讨论】:
【参考方案1】:当然,在寻求帮助后不久,我在朋友的帮助下解决了问题。对于其他可能需要答案或可能有更好解决方案的人,我补充说:
我只是将数据的 user_id 设置为我的 AppController 的 beforeFilter 中设置的当前登录用户的 id。
网站控制器
public function add()
if ($this->request->is('post'))
$this->Website->create();
// This is the line I added
$this->request->data['user_id'] = $this->Auth->user('id');
if ($this->Website->UserWebsite->saveAll($this->request->data, array('deep' => true)))
$this->Session->setFlash(__('The website has been saved'));
$this->redirect(array('action' => 'index'));
else
$this->Session->setFlash(__('The website could not be saved. Please, try again.'));
【讨论】:
【参考方案2】:尽管如此,您仍然没有按照正确的 CakePHP 方式进行操作。
它目前仅在工作,因为您定义了一个 hasMany,在这种情况下,它不是正确的关系,因为您在这里只需要 HABTM。
将您的表格重命名为:
users_websites
这是正确的 CakePHP,正如您所见,您实际上也在您的 HABTM 中以这种方式定义了它。
现在您可以删除 hasMany,Cake 应该会自动通过 HABTM 保存,而不是像您现在所做的那样通过 hasMany。
您仍然需要像以前那样做,因为 user_id 不是通过您的表单/请求定义的,您总是需要像以前那样定义它。
【讨论】:
你说得对,我把我的桌子和其他一些东西都叫错了。我继续并更改了所有内容以反映正确的约定。我也需要离开:if ($this->Website->UserWebsite->saveAll($this->request->data, array('deep' => true)))
吗?我用原来的if ($this->Website->save($this->request->data))
试了一下,还是不行。如果我可以通过仅提供用户 ID 将其自动保存到 users_websites 表中,那将是理想的;这样我就不必为每个 HABTM 关系更改 add 函数中的保存行。以上是关于Cakephp 2.2.3 habtm 保存到中间表的主要内容,如果未能解决你的问题,请参考以下文章