在CakePHP HABTM中,$ this-> Model1-> Model2完成了什么?

时间:2014-06-19 13:41:22

标签: cakephp cakephp-2.0 cakephp-2.1 cakephp-2.3

基本上,我已经在CakePHP中成功实施了HABTM,但问题是,我不明白它为什么会起作用。

我讨厌CakePHP食谱的事情就是告诉你该怎么做但是很难解释他们代码的底层部分。

基本上,我的数据模型是这样的。

任务HABTM问题

我不理解这段代码片段。

$this->set('questions', $this->Task->Question->find('list'))

特别是什么是$ this->任务 - >问题应该完成?

以上代码如何在视图中链接到此代码片段?

echo $this->Form->input('Question'); 

一件非常奇怪的事情是,通过上面的代码片段,我得到了一个多选项。

但是,如果我将代码更改为此,

echo $this->Form->input('question');

我得到一个选择下拉列表。

我仔细检查了整个文档,仍然无法找到令我满意的解释。

如果有人能为我澄清这个问题,我真的很感激。

1 个答案:

答案 0 :(得分:3)

1。模型链

当模型与另一个模型有关联时(比如您的示例中的HABTM模型),您可以通过将其链接到当前模型来调用关联模型的方法。这在Associations的早期解释,并且在第一部分的末尾给出了它的确切工作原理的示例。

如果您位于TasksController的某个地方,通常情况下您会认为只有Task模型可用。相反,Task模型中描述的任何关联都以$this->Model1->Model2的形式链接到该模型。

所以$this->set('questions', $this->Task->Question->find('list'))表示:

从您了解的当前模型Task,访问关联的模型Question,然后调用其find('list')方法。然后$this->set将结果视为变量questions

2。 FormHelper约定

当您使用CamelCased单个名称进行字段输入时,就像在$this->Form->input('Question');中您对FormHelper所说的那样questions变量中包含的数据来自名为Question的模型因此,HABTM关联应该作为多重选择处理(因为HABTM指向这样的关联)。

如果字段名称为model_id,就像在此示例question_id中一样,您需要单个选择(选择已连接模型的单个ID)。

使用其他任何东西,FormHelper会查看字段定义并自行决定,但当然您可以使用选项覆盖所需的任何默认行为。

这是explained in detail,我很惊讶你错过了这两个。 CakePHP拥有最好的文档之一,几乎所有你需要的东西都在那里。