cakePHP只有一个关系未自动完成下拉字段

cakePHP只有一个关系未自动完成下拉字段,cakephp,relationship,has-one,Cakephp,Relationship,Has One,我试图在两个模型之间实现hasone关系,但是我不能在第二个模型(属于第一个模型的模型)中使用可能的选项自动完成“添加”表单。这是我的代码: -model 1:item.php <?php class Item extends AppModel{ var $name = 'Item'; var $primaryKey = 'id'; var $hasOne = 'CoverImage'; } ?> 与此相反: echo $this->For

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

-model 1:item.php

<?php
class Item extends AppModel{ 

    var $name = 'Item';
    var $primaryKey = 'id';
    var $hasOne = 'CoverImage';
    }
?>
与此相反:

echo $this->Form->input('item_id');
我可以添加/编辑*item_id*字段,我可以在文本框中看到它的值。然而,如果我离开另一个,我只会看到一个空的dropbox,当我尝试添加/编辑CoverImage时,它不起作用,它只显示一个空的白色页面,甚至没有错误


也许这是一个线索…

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

public function add() {
    $items = $this->CoverImage->Item->find('list');
    $this->set(compact('items'));
}
FormHelper仅自动推断字段
item\u id
应由变量
$items
中的选项填充(复数,无
\u id

一定要小心,已经有一个封面图片的项目不应该是该列表的一部分
find('list',array('conditions'=>array('CoverItem.id'=>null))
可能会处理这个问题,但您也需要在保存之前重新检查,或者需要重新考虑您的关联


*我无法确定这是否适用于
“列表”
搜索。

这是一个很好的问题。你已经与Cake's Association的一个不真实的特性发生了冲突:

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

…一个人的。

$hasOne就是这样的独家产品。它“使用”了那些“有”关系(它使关系成为事实上的单例-因此用户只有一个配置文件只有一个用户)。考虑-数据库可以有很多配置,但是Dbo每次只会有一个连接,连接只会有一个DBO。因此->hasOne支持两个模特结婚,直到他们分手

--因此,它的使用量远不如它所拥有的那么多

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

添加一个额外的$this->Item->find并不能真正解决问题(我也不推荐这样做,除非你已经基本上完成了两个模型/控制器,或者你主动希望事情开始变得很快。)

另外,更改调用表单帮助器方法的方式-如果从查找返回“list”类型的fetch,Cake将自动从中生成一个选项列表。实际发生的情况是,您在非常小的视图范围内偷偷地浏览您的模型。这就是为什么不鼓励将输入类型指定为“打破魔法”(如果您愿意,完全可以这样做。只需了解实际发生的情况,或者:看,奇怪,快速)

但是你可能想重新考虑一下你是如何将你的模型关联起来的——如果说每个项目都属于一个封面图片(就像每个封面图片都属于一个项目一样),这难道不正确吗——因为你有一个表单明确允许封面图片选择一个项目,任何项目,与之一起显示?你可能会得到更好的结果


HTH.:)

尝试:
echo$this->Form->inputs()一次为所有属性生成表单字段是一种自动方式。这不是一个直截了当的答案/解决方案,但可能有助于你找到线索。我85%确信,该查询实际上会提取一个关联CoverImage+项目对的列表,因为hasOne会自动键入id。当然,你可以操纵它,以产生一种印象,即你已经提取了CoverImage可供选择的所有可用项目,在第一个上面堆第二个黑客。然后,假设用户选择了一个已经有CoverItem的项目。要在项目的hasOne周围保存这些信息,将是第三个可能破坏数据库/破坏应用程序的黑客。foreach($hack){$this->answer--}@satyr我真的不知道你在说什么
find('list')
将以
array($id=>$name)
的形式获取所有项的数组。你是对的,这可能与“hasOne”的概念相冲突(如果这是你想说的),补充了一条关于这一点的说明。我试过了,它成功了!虽然我不知道你在评论的第二部分(关于小心)是什么意思。我在我的编辑操作中也尝试过这种方法,而且似乎效果很好,没有使用find中的conditions数组。我应该用它们吗?如果你不介意解释为什么?@Albert你的物品目前只有一张封面图片。这意味着您不能为两个不同的封面图像选择相同的项目(因为这样该项目将有许多封面图像)。这就是你需要注意或确认你是否真的选择了正确的关联。在OP的问题中。我试图描述的问题不是它不起作用,而是在这种情况下,这将是你最不想做的事情。银行有很多用户,有很多账户。用户属于银行。帐户只有一个用户。因为账户的银行可以通过其用户访问。如果你不打算尊重这种关系的排他性,比如你发现自己故意写下“俯冲”发现并围绕它们的结果跳舞,这通常意味着真正的问题是分配的关系不合适。谢谢你的解释。问题是,我不认为将关系的顺序从Item->CoverImage切换到CoverImage->Item有什么好处,如果这是你的意思的话。。。我尝试了deceze给出的解决方案,但是对于他所说的和你所说的,这样做可能会有一些不好的地方,尽管我似乎不知道这是什么…切换顺序不会改变任何事情,除非你将CoverImage表包括在Items$uses数组中,否则这样做会有任何影响
echo $this->Form->input('item_id', array('type'=>'text'));
echo $this->Form->input('item_id');
public function add() {
    $items = $this->CoverImage->Item->find('list');
    $this->set(compact('items'));
}