CakePHP 2.1 - 模型关联 - 保存和查找

Posted

技术标签:

【中文标题】CakePHP 2.1 - 模型关联 - 保存和查找【英文标题】:CakePHP 2.1 - Model Associations - Save & Find 【发布时间】:2012-06-20 15:48:15 【问题描述】:

在这里阅读食谱和各种问答之后,我仍然对模型关联及其作用在概念上有些困惑。我希望有人可以帮助我解决这个问题。所以这是我的问题:

据我所知,模型关联有助于阅读/查找相关数据。那么如果我加载一个用户,那么该用户的所有帖子也会被加载吗?但是,Cakephp 在保存新条目方面真的没有做太多事情吗?例如:如果我创建一个新帖子,那么我必须手动为相关用户指定 user_id 字段,CakePHP 不会以某种方式自动执行吗?手动我的意思是在这个答案中明确定义导师 ID:CakePHP model associations table w/data and new table

为什么在保存时需要“提及”两个模型?例如 $this->Mentor->Student->save($student)。这是一种跟踪双向关联的方法吗??

【问题讨论】:

【参考方案1】:

如果我加载一个用户,那么该用户的所有帖子也会被加载?

是的,CakePHP 将加载所有相关数据,除非您 unbind 或 bind 模型或更改您正在使用的模型的递归属性。

但是,CakePHP 真的没有为保存新条目做太多事情吗? 示例:如果我创建一个新帖子,那么我必须指定 user_id 手动输入相关用户的字段,CakePHP 不这样做 以某种方式自动?

您必须为用户指定 ID,然后进行保存,当您从具有指定 ID 的模型保存时,它将处理其余部分。例如,假设您有一个 Post 和一个 User 模型,并且用户使用 Auth 登录:

  $this->request->data['Post']['user_id'] = $this->Auth->user('id');
  if ($this->Post->save($this->request->data)) 
    $this->Session->setFlash('Your post has been saved.');
    $this->redirect(array('action' => 'index'));
  

所以没有必要同时提及这两个模型,如果您同时提及这两个模型,您可以执行以下操作,再次以帖子和用户为例。

$this->User->read(null, $this->Auth->user('id'));
if ($this->User->Post->save($this->request->data)) 
  $this->Session->setFlash('Your post has been saved.');
  $this->redirect(array('action' => 'index'));

这等同于前一种情况,因为您正在使用用户数据加载用户模型并为该用户保存一个帖子。

【讨论】:

【参考方案2】:

我假设您使用的是belongTo 关系,但我认为它可能是食谱中描述的任何类型

如果我加载一个用户,那么该用户的所有帖子也会被加载?

是的,如果您设置了正确的关系(belongsTo、hasA 等),Cake 会自动处理此问题

但是,CakePHP 真的没有为保存新条目做太多事情吗? 示例:如果我创建一个新帖子,那么我必须指定 user_id 手动输入相关用户的字段,CakePHP 不这样做 以某种方式自动?

我相信这是使用 saveAll, saveAssociated, etc. 方法处理的,但我还没有遇到使用它的场景

为什么在保存时需要“提及”两个模型? 例如 $this->Mentor->Student->save($student)。有没有办法保持 跟踪双向关联??

这是因为您要保存主模型及其依赖项(同样取决于您建立关系的方式),因此您需要明确说明。其他方法是导入 StudenController(根据您的示例)和 (after constructing the classes) 调用保存方法 $studentController->Student->save($student)

希望对你有帮助

【讨论】:

谢谢,正如你所说, saveAll() 似乎解决了这个问题。我有点不熟悉你说的保存依赖是什么意思?我不仅使用 save() 保存在主模型中吗?我是否同时保存到两个模型?

以上是关于CakePHP 2.1 - 模型关联 - 保存和查找的主要内容,如果未能解决你的问题,请参考以下文章

Cakephp 2.1 手动保存关联对象

CakePHP 3:保存关联模型失败

在 CakePHP 中保存时如何验证关联模型是不是存在

CakePHP - 如何在保存时将关联记录添加到模型中?

CakePHP 模型关联 HasMany - 保存错误

在 Cakephp 3 中保存关联模型