我正在尝试在2个模型之间实现hasone关系,但我不能在第二个模型中使用'em> belongsTo 的第一个模型中的'add'表单自动完成一)。这是我的代码:
- 型号1: item.php
<?php
class Item extends AppModel{
var $name = 'Item';
var $primaryKey = 'id';
var $hasOne = 'CoverImage';
}
?>
- 模型2: cover_image.php
<?php
class CoverImage extends AppModel{
var $name = 'CoverImage';
var $primaryKey = 'id';
var $belongsTo = array(
'Item' => array(
'className' => 'Item',
'foreignKey' => 'item_id'
));
}
?>
- 添加模型2的视图: add.ctp
<?php echo $this->Form->create('CoverImage',array('url' => array('controller' => 'admins', 'action' => 'add')));?>
<fieldset>
<legend><?php __('Info'); ?></legend>
<?php
echo $this->Form->input('item_id');
echo $this->Form->input('description');
?>
</fieldset>
<?php echo $this->Form->end(__('Create', true));?>
对于我在Cake的文档中看到的,使用此关系,在添加视图中,我应该会在 item_id 字段中看到一个下拉列表,以便能够选择item CoverImage 属于,但是下拉列表是空的(是的,我已经在items表中有了一些 items )。
也许我错过了什么或者我做错了什么,但我无法理解。非常感谢您提供任何线索!
修改
有人认为我刚刚意识到,如果我这样做:
echo $this->Form->input('item_id', array('type'=>'text'));
而不是:
echo $this->Form->input('item_id');
我可以添加/编辑* item_id *字段,我可以在文本框中看到它的值。但是,如果我离开另一个,我只看到一个空的Dropbox,当我尝试添加/编辑 CoverImage 时,它不起作用,它只显示一个空的白页,甚至没有错误...
也许这是一种导致......
答案 0 :(得分:2)
为了使其工作,您必须在控制器中创建可能选项的列表。这不会自动发生。
public function add() {
$items = $this->CoverImage->Item->find('list');
$this->set(compact('items'));
}
FormHelper仅自动推断字段item_id
应填充变量$items
中的选项(复数,无_id
)。
请注意,已经 hasOne CoverImage的项目不应该是该列表的一部分。 find('list', array('conditions' => array('CoverItem.id' => null)))
可能 *负责照顾,但您需要在保存之前重新检查,或者您需要重新考虑您的关联。
*我不确定这是否适用于'list'
次搜索。
答案 1 :(得分:0)
优秀的问题。你已经碰到了蛋糕协会的虚假功能:
考虑到您将关系定义为 hasOne ?猜测跟踪,但Cake甚至可能正确地推断出您对列表功能的偏好。你有自动列表......
......一个人。
$ hasOne非常独特。它“消耗”那些“有”关系(它使得这种关系成为事实上的单身人士 - 所以用户只有1个个人资料&lt; - &gt;个人资料只有1个用户)。考虑 - 数据库可以有许多配置,但Dbo一次只能有一个连接,而Connection只有一个Dbo。因此 - &gt; hasOne用于结合两个模型直到die()它们是否分开。
- 因此它的使用率几乎与hasMany和belongsTo一样少。
出于您的目的,您可能希望更改为其他关联。
添加额外的$ this-&gt; Item-&gt; find并没有真正修复错误的内容(我不推荐它,除非你大部分时间都使用这两个模型/控制器,或者你主动想要的东西快开始变得怪异。)
另外,更改调用Form Helper方法的方式 - 如果从find中返回'list'类型提取,Cake将自动生成一个选项列表。实际发生的是,你在一个非常薄的View功能边缘偷偷摸摸你的模型。这就是为什么指定输入类型“打破魔法”往往是不鼓励的(如果你想要的话,你完全可以。只要了解实际发生的事情,或者:看,奇怪,快速。)
但是你可能想重新思考你如何关联你的模型 - 这也不是正确的说,每个Item属于一个CoverImage(每个CoverImage都属于一个Item) - 因为你有一个明确的形式允许CoverImage选择要显示的项目,任何项目?你可能会得到更好的结果。
HTH。 :)