1

我正在尝试在 2 个模型之间实现hasone关系,但是我不能使用第二个模型(属于第一个模型的那个)中的可能选项来自动完成“添加”表单。这是我的代码:

- 模型 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字段中看到一个下拉列表,以便能够选择此CoverImage属于哪个项目,但下拉列表是空的(是的,我项目表中已经有一些项目)。

也许我错过了什么或者我做错了什么,但我无法弄清楚。非常感谢您提供任何线索!

编辑

我刚刚意识到的一个想法是,如果我这样做:

echo $this->Form->input('item_id', array('type'=>'text'));

而不是这个:

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

我可以添加/编辑 *item_id* 字段,我可以在文本框中看到它的值。但是,如果我离开另一个,我只会看到一个空的保管箱,当我尝试添加/编辑CoverImage时,它​​不起作用,它只显示一个空白页面,甚至没有错误......

也许这是一个线索......

4

2 回答 2

2

为了让它工作,你必须在控制器中创建一个可能的选项列表。这不会自动发生。

public function add() {
    $items = $this->CoverImage->Item->find('list');
    $this->set(compact('items'));
}

FormHelper 仅自动推断该字段item_id应由变量中的选项$items(复数,否_id)填充。

请注意,已经有一个 CoverImage的项目不应成为该列表的一部分。可能find('list', array('conditions' => array('CoverItem.id' => null)))*会解决这个问题,但您也需要在保存之前重新检查,或者您需要重新考虑您的关联。

* 不确定这是否适用于'list'搜索。

于 2011-06-23T00:05:15.017 回答
0

很好的问题。您与 Cake 关联的一个不诚实的特征发生了冲突:

考虑到您将关系定义为hasOne?猜测跟踪,但 Cake 甚至可能正确地推断出您对列表功能的偏好。你有你的自动列表...

……一个。

$hasOne 是非常独特的。它“用完”那些“有”关系(它使关系成为事实上的单例 - 所以用户只有 1 个配置文件 <-> 配置文件只有 1 个用户)。考虑 - 数据库可以有多种配置,但 Dbo 一次只能有一个 Connection,而 Connection 只能有一个 Dbo。因此 -> hasOne 是为了让两个模型结婚,直到 die() 他们分开。

-- 所以它不像hasMany 和belongsTo 那样被使用。

出于您的目的,您可能希望更改为不同的关联。

添加一个额外的 $this->Item->find 并不能真正解决问题(我不推荐它,除非您大部分时间都使用了两个模型/控制器,或者您积极希望事情开始变得越来越奇怪。 )

此外,更改调用 Form Helper 方法的方式 - 如果您从 find 中返回 'list' 类型的 fetch,Cake 将自动从中生成一个选项列表。实际发生的情况是,您在模型的视图功能非常薄弱的​​边缘偷偷摸摸。这就是为什么不鼓励指定输入类型来“打破魔法”的原因(如果你愿意,你完全可以这样做。只要了解实际发生的事情,或者:看,奇怪,快。)

但是你可能想重新考虑你是如何关联你的模型的——如果说每个项目都属于一个 CoverImage (就像每个 CoverImage 属于一个项目一样)是不是也是正确的——因为你有一个明确允许 CoverImage 的表单选择要显示的项目,任何项目?你可能会得到更好的结果。

HTH。:)

于 2011-06-23T00:20:42.663 回答