2

わかりました、私は完全に困惑しています。私は友人のビジネスを支援するための軽いアプリを作成しています。あまり詳しくは説明しませんが、いくつかの背景を説明するために、彼はいくつかのブランドからコンポーネントを取得し、これらのコンポーネントからウィジェットを構築しています。

各ウィジェットにはいくつかのコンポーネントがあり、それらの異なるコンポーネント オプションのいくつかは同じブランドによって作成されているため、ブランドごとに製品を簡単に表示できるように、コンポーネントからブランドを分離したいと考えています。

次のテーブルがあります

  • ブランド
  • コンポーネント
  • ウィジェット

ブランドには「id」と「name」が含まれます コンポーネントには「id」「model」「brand_id」が含まれます ウィジェットには「id」「compoennt_id」が含まれます

ブランドの表示フィールドは「名前」です コンポーネントの表示フィールドは「モデル」です

そして、ここに問題があります。新製品を追加するとき、ケーキは明らかにフォームに「モデル」しか表示しません。「brand_id」と「model」を組み合わせて表示する仮想表示フィールドを作成できますが、そのモデルがどのブランドのものであるかをユーザーが知らないという問題は実際には解決されません。

一見怠惰な解決策: ブランド テーブルをまとめて削除し、その情報をコンポーネント テーブルに格納します。

新しいウィジェットを追加するときにフォームで、ドロップダウン ボックスに「ブランド モデル」が表示されるように、これを別の方法で行う方法はありますか?

4

2 に答える 2

1

私は同様の問題を解決しましたが、問題のモデルには有用なデータがなく、関連する他の 2 つのモデルから名前を取得する必要がありました。私は CakePHP に非常に慣れていないので、このソリューションがどれだけ「適切」であるか、どれだけうまくスケーリングできるかなどを保証することはできませんが、うまくいくようです。また、私は CakePHP 1.3 でこれを使用しているので、私の解決策はあなたには当てはまらないかもしれません。

とにかく、ここに私がモデルに追加したものがあります:

    function __construct($id = false, $table = null, $ds = null) {
            parent::__construct($id, $table, $ds);
            $list = parent::find('all', array('contain' => array(
                    'OtherModelA.name', 'OtherModelB.name')));
            if( !empty( $list) ) { //just in case there are no results
                    $this->virtualFields['name'] = sprintf("'%s - %s'",$list[0]['ProductionCompany']['name'],$list[0]['Musical']['name']);
                    $this->displayField = 'name';
            }
    }

編集: DB が完全に空のときにいくつかのエラーに気付いたので、条件を追加し、displayField をコンストラクターに移動しました。

于 2012-09-16T00:10:35.127 に答える
1

昨日、同じことを調べるのにあまりにも多くの時間を費やしました。

あなたができると思うのは、ウィジェットモデルに仮想ディスプレイフィールドを設定することです

    $this->virtualFields['cool_display_name'] = 
        sprintf('CONCAT(%s.name, " - ", %s.model)', $this->Brands->alias, $this-  >Components->alias);

しかし、これは、「検索」機能がクエリを実行するときに十分なデータを取得しない限り機能しません。おそらくドロップダウンで呼び出している find('list') は、デフォルトの再帰が -1 に設定されているため、それを取得するために下にトラバースすることはありません。私の場合、ウィジェットモデルのfind()を次のようにオーバーライドしました。

    public function find($type = 'first', $query = array()) {
    $return = array();
    switch ($type) {
        case 'list': // having to deal with a virtual field, seems like the least-messy workaround right now.
            $query['contain'] = 'User.full_name';
            $results = parent::find('all', $query);
            foreach($results as $k => $r) {
                $return[$r[$this->alias]['id']] = $r['User']['full_name'];
            }
            break;
        default:
            $return = parent::find($type, $query);
            break;
    }
    return $return;
}

ここで私が行っているのは、要素のリストボックスが期待する配列を手作業で作成することです。これは次のようなもの array( 'id' => 'display text') です。また、cakephp の Contain 機能を使用したこともわかります。そのため、すべてのデータが返されるわけではなく、必要なものだけが返されます。すべての仮想フィールド データが提供されるようにします。

于 2012-05-16T16:51:55.103 に答える