cakePHP hasOne关系不自动完成下拉字段

时间:2011-06-22 23:08:23

标签: cakephp relationship has-one

我正在尝试在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 时,它不起作用,它只显示一个空的白页,甚至没有错误...

也许这是一种导致......

2 个答案:

答案 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。 :)