2016-04-13 10 views
0

Ich möchte in einer Dropdown-Liste (selectlist) anzeigen, die den Wert eines Feldes aus dem Modell und ein Feld aus einem verwandten verkettet Modell. Ich habe eine Tabelle 'working_day', die mit einer Tabelle 'user' und 'pause' verknüpft ist. In der Ansicht 'Pause' (hinzufügen und bearbeiten) habe ich eine Dropdown-Liste, die die working_day_id anzeigt, aber ich möchte die Felder 'date' von 'WorkingDay' und die Felder 'username' von 'User' anzeigen.

Zum Beispiel: 13/04/2016 (Jerome S).

Ich habe bereits versucht $ virtualfield, es funktioniert, wenn ich Feld von 'WorkingDay' verwenden, aber es funktioniert nicht, wenn ich das Feld von 'Benutzer' verwenden.CakePHP Dropdown-Liste (selectlist) + Wie man einen Wert aus dem Modell und einem verwandten Modell anzeigen

db schema

die $ virtualfield, die ich versucht:

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

Ich habe auch versucht die Lösung unten vorgeschlagen, aber es funktioniert nicht, tritt das gleiche Problem:

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

Hat jemand wissen, wie man das Problem löst?
Vielen Dank im Voraus.

Antwort

0

Es gibt einige Probleme mit ihm auf diese Weise tun, wenn ein anderes Modell Alias ​​verwendet wird, eine andere empfohlene Weg ist, diese in die Modelle konstruieren Verfahren zu handhaben:

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

Dies wird in diesem Abschnitt des Buches beschrieben: http://book.cakephp.org/2.0/en/models/virtual-fields.html#virtual-fields-and-model-aliases

0

Ich habe eine ähnliche Situation, wo ich eine Liste erstellen muss, die zwei Felder aus verschiedenen Tabellen kombiniert. Am Ende habe ich find() überschrieben, um die entsprechende Liste zurückzugeben.

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

Es kann ein eleganteren Weg, um die Liste zu formatieren, die Sie zurückgeben möchten, aber dies stellt die allgemeine Idee.