1

2 つのモデル間に hasone 関係を実装しようとしていますが、2 番目のモデル (最初のモデルに属するモデル) で可能なオプションを使用して「追加」フォームをオートコンプリートすることはできませ。これは私のコードです:

- モデル 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が属するアイテムを選択できるはずですが、ドロップダウンは空です (はい、私はitems テーブルにすでにいくつかの項目があります)。

たぶん私は何かを見逃しているか、何か間違ったことをしましたが、それを理解することはできません. 手がかりを事前にどうもありがとう!

編集

私が今気づいたことの1つは、私がこれを行う場合:

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) によってフィールドに入力する必要があることのみを自動的に推測します。

すでに 1 つの CoverImage を持っているアイテムをそのリストに含めないように注意してください*おそらくfind('list', array('conditions' => array('CoverItem.id' => null)))それを処理しますが、保存する直前にも再確認するか、関連付けを再考する必要があります。

'list'* それが検索で機能するかどうかは、頭の中でよくわかりません。

于 2011-06-23T00:05:15.017 に答える
0

素晴らしい質問です。あなたは、Cake の関連付けの不誠実な機能に違反しています。

リレーションシップをhasOneとして定義したとしますか? トレースを推測すると、Cake はリスト機能に対するユーザーの好みをおそらく正しく推測しました。自動魔法のリストを手に入れた...

...ひとつの。

$hasOne はそのように非常に排他的です。それらの「持っている」関係を「使い果たします」(関係を事実上のシングルトンにするため、ユーザーはプロファイルを1つしか持たない<->プロファイルにはユーザーを1つしか持たない)。考慮事項 - データベースには多くの構成を設定できますが、Dbo には一度に 1 つの接続しかなく、接続には Dbo が 1 つしかありません。したがって、-> hasOne は、死ぬまで 2 つのモデルを結婚させるためのものです。

-- そのため、hasMany や belongsTo ほどには使用されません。

あなたの目的のために、おそらく別の関連付けに変更したいと思うでしょう。

追加の $this->Item->find を追加しても、何が問題なのかを実際に修正することはできません (両方のモデル/コントローラーでほぼ完了している場合や、積極的に物事を奇妙に速く開始したい場合を除き、お勧めしません. )

また、フォーム ヘルパー メソッドの呼び出し方法を変更します。検索結果から「リスト」タイプのフェッチを返す場合、Cake はそこからオプション リストを自動的に生成します。実際に起こっていることは、ビュー機能の非常にわずかなマージンでモデルをこっそりと回避しているということです。そのため、入力タイプを「魔法を破る」ように指定することは推奨されない傾向があります (これは、必要に応じて完全に行うことができます。実際に何が起こっているのかを理解するだけです。または、奇妙で高速です)。

ただし、モデルを関連付ける方法を再考することをお勧めします。CoverImage を明示的に許可するフォームがあるため、各 Item は CoverImage に属する (各 CoverImage が Item に属するのと同じ) と言うのも正しいでしょうか?一緒に表示するアイテム、任意のアイテムを選択するには? おそらくより良い結果が得られるでしょう。

HTH。:)

于 2011-06-23T00:20:42.663 に答える