2012-04-14 10 views
2

大丈夫、私は完全に困惑しています。私は彼のビジネスで私の友人を助ける軽いアプリを作っています。私はあまりにも多くの細部には行きませんが、いくつかの背景のために、彼はいくつかのブランドからコンポーネントを取り出し、これらのコンポーネントからウィジェットを構築します。表示フィールドに2つの関連モデルからフィールドを結合するケーキPHP 2.0

各ウィジェットにはいくつかのコンポーネントがあり、それらのコンポーネントオプションのいくつかは同じブランドで作成されているため、ブランドとコンポーネントを分けて、ブランドで簡単に商品を見ることができます。

私はブランドが "ID" と "名前" コンポーネントbrand_id」 "ID" "モデル" が含まれて含まれてい

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

次のテーブルを持っています" ウィジェットには" id "" compoennt_id "が含まれています

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

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

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

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

答えて

1

私は昨日同じことを調べるのに時間がかかりすぎました。

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

:しかし、これはあなたのない限り動作しません私はあなたが行うことができると思う何

はのような何かをするウィジェットモデルにおける仮想displayfieldが制限仮想フィールド制限部in this section of book.cakephp.comで提案されて設定されています'find'関数は、クエリを実行するときに十分なデータを取得しています。おそらくあなたのドロップダウンを呼び出すものであるfind( 'list')は、デフォルトの再帰を-1に設定しているので、それを取得するために横断することはありません。私はそこでやることは手で似ている要素のためのリストボックスが期待している配列を、構築され

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機能が使用されているので、すべてののデータは返されませんでしたが、すべての仮想フィールドデータを提供するために必要なものだけが返されました。

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'; 
      } 
    } 

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

+1

私は何を喫煙していたのかわかりません。これは実際には全く機能しません。 – Carl

関連する問題