2016-04-13 13 views
0

モデルからのフィールドの値と関連するフィールドの値を連結したドロップダウンリスト(選択リスト)に表示したいモデル。私は、テーブル 'user'と 'pause'にリンクされているテーブル 'working_day'を持っています。 'Pause'(追加と編集)ビューでは、working_day_idを表示するドロップダウンリストがありますが、 'WorkingDay'のフィールド 'date'と 'User'の 'username'フィールドを表示したいとします。

例:13/04/2016(ジェロームS)。

私はすでに$ virtualfieldを試しましたが、 'WorkingDay'のフィールドを使用すると動作しますが、 'User'のフィールドを使用すると動作しません。Cakephpのドロップダウンリスト(選択リスト)+モデルと関連するモデルから値を表示する方法

db schema

私が試したの$ virtualfield:

public $virtualFields = array('workingday_display_field' => 'concat(WorkingDay.date_working_day, " (", User.username, ")")'); 
public $displayField = 'workingday_display_field'; 

は、私はまた、溶液は、以下の提案が、それは動作しません試してみましたが、同じ問題が発生します。

public function __construct($id = false, $table = null, $ds = null) { 
    parent::__construct($id, $table, $ds); 
    $this->virtualFields['workingday_display_field'] = sprintf('concat(%s.date_working_day, " (", %s.username, ")")', $this->alias, $this->User->alias);  
    $this->displayField = "workingday_display_field"; 
} 

は誰もい問題の解決方法を知っていますか?
ありがとうございます。

答えて

0

異なるモデルの別名を使用している場合、このようにそれをやっていくつかの問題がありますが、別のお勧めの方法は、モデルの構造方法でこれらを処理することです:

public function __construct($id = false, $table = null, $ds = null) { 
    parent::__construct($id, $table, $ds); 
    $this->virtualFields['name'] = sprintf('CONCAT(%s.first_name, " ",%s.last_name)', $this->alias, $this->alias); 
    $this->virtualFields['namewithemail'] = sprintf('CONCAT(%s.first_name, " ", %s.last_name, " (", %s.email, ")")', $this->alias, $this->alias, $this->alias); 
    $this->displayField = "namewithemail"; 
} 

これは本書のこのセクションで説明されています。 http://book.cakephp.org/2.0/en/models/virtual-fields.html#virtual-fields-and-model-aliases

0

私は、異なるテーブルの2つのフィールドを組み合わせたリストを作成する必要があるのと同様の状況があります。私がやったことは、find()をオーバーライドして適切なリストを返すことでした。

public function find($type = 'first', $params = array()) { 
    $workingdays = array(); 

    if ($type == 'list'){ 
     $params = array_merge(
      array('contain' => array('User')), 
      $params 
     ); 
     $workingdaysUnformatted = parent::find('all', $params); 
     foreach($workingdaysUnformatted as $workingday){ 
      $workingdays['WorkingDay']['workingday_display_field'] = $workingday['WorkingDay']['date'].' ('.$workingday['User']['username'].')' 
     } 
    } 
    else 
     $workingdays = parent::find($type, $params); 

    return $workingdays; 
} 

はあなたが返すようにしたいリストをフォーマットするclassier方法があるかもしれませんが、これは一般的な考えを示しています。

関連する問題