基本上,我已经在CakePHP中成功实施了HABTM,但问题是,我不明白它为什么会起作用。
我讨厌CakePHP食谱的事情就是告诉你该怎么做但是很难解释他们代码的底层部分。
基本上,我的数据模型是这样的。
任务HABTM问题
我不理解这段代码片段。
$this->set('questions', $this->Task->Question->find('list'))
特别是什么是$ this->任务 - >问题应该完成?
以上代码如何在视图中链接到此代码片段?
echo $this->Form->input('Question');
一件非常奇怪的事情是,通过上面的代码片段,我得到了一个多选项。
但是,如果我将代码更改为此,
echo $this->Form->input('question');
我得到一个选择下拉列表。
我仔细检查了整个文档,仍然无法找到令我满意的解释。
如果有人能为我澄清这个问题,我真的很感激。
答案 0 :(得分:3)
当模型与另一个模型有关联时(比如您的示例中的HABTM模型),您可以通过将其链接到当前模型来调用关联模型的方法。这在Associations的早期解释,并且在第一部分的末尾给出了它的确切工作原理的示例。
如果您位于TasksController
的某个地方,通常情况下您会认为只有Task
模型可用。相反,Task
模型中描述的任何关联都以$this->Model1->Model2
的形式链接到该模型。
所以$this->set('questions', $this->Task->Question->find('list'))
表示:
从您了解的当前模型Task
,访问关联的模型Question
,然后调用其find('list')
方法。然后$this->set
将结果视为变量questions
。
当您使用CamelCased单个名称进行字段输入时,就像在$this->Form->input('Question');
中您对FormHelper所说的那样questions
变量中包含的数据来自名为Question
的模型因此,HABTM关联应该作为多重选择处理(因为HABTM指向这样的关联)。
如果字段名称为model_id
,就像在此示例question_id
中一样,您需要单个选择(选择已连接模型的单个ID)。
使用其他任何东西,FormHelper会查看字段定义并自行决定,但当然您可以使用选项覆盖所需的任何默认行为。
这是explained in detail,我很惊讶你错过了这两个。 CakePHP拥有最好的文档之一,几乎所有你需要的东西都在那里。