2013-02-27 12 views
6

Ich habe ein Modell namens User, die eine Virtual field namens full_name hat. Als ich mein Modell zugreifen User in einer find() Abfrage, kann ich ohne Probleme wie diese Bedingungen auf meinem virtuellen Feld gesetzt:cakephep modell virtualFields funktioniert nicht über enthalten

$user = $this->User->find('first', array(
    'recursive' => -1, 
    'conditions' => array(
     'User.full_name' => 'Bruce Thomas' 
    ) 
)); 

Die Abfrage oben kehrt mir erfolgreich die Daten für den Benutzer Bruce Thomas genannt. Aber das Problem entsteht, wenn ich versuche, mein Modell Benutzer durch ein anderes Modell über das Contain Verhalten wie folgt zu verwenden:

$user = $this->MyOtherModel->find('first', array(
    'contain' => array('User'), 
    'conditions' => array(
     'MyOtherModel.id' => $my_other_model_id 
     'User.full_name' => 'Bruce Thomas' 
    ) 
)); 

(Dieses Beispiel oben geht davon aus, dass MyOtherModel hat eine belongsTo Beziehung mit meinem Modell MyOtherModel)

Der Abfrage oben gibt mir folgende Fehlermeldung:

Warning (512): SQL Error: 1054: Unknown column 'User.full_name' in 'on clause' [CORE\cake\libs\model\datasources\dbo_source.php, line 681]

Irgendwelche Hilfe, wie ich das bitte tun kann? Danke

+0

Können Sie hinzufügen/set 'Configure :: write ('debug', 2);' in „app/config/core.php "und addiere' element ('sql_dump'); ?> 'in Ihrem Code, um Abfragen zu überprüfen? –

+0

Können Sie Ergebnisse ohne Bedingungen kopieren? –

Antwort

10

Nach der neuesten CakePHP Dokumentation (für v2 und höher), das ist eine Einschränkung der virtuellen Felder - this is what it says:

The implementation of virtualFields has a few limitations. First you cannot use virtualFields on associated models for conditions, order, or fields arrays. Doing so will generally result in an SQL error as the fields are not replaced by the ORM. This is because it difficult to estimate the depth at which an associated model might be found. A common workaround for this implementation issue is to copy virtualFields from one model to another at runtime when you need to access them:

$this->virtualFields['name'] = $this->Author->virtualFields['name']; 

oder

$this->virtualFields += $this->Author->virtualFields; 

Mehr Details hier : http://book.cakephp.org/2.0/en/models/virtual-fields.html - Wenn Sie vorhaben, die vorgeschlagenen Optionen zu implementieren (die mir ganz gut erscheinen), sollten Sie sich den Abschnitt "Virtuelle Felder und Modell-Aliase" ansehen Vermeiden Sie Feldnamen Zusammenstöße (d. h. Wenn Sie in zwei Modellen ein Feld mit dem Namen full_name haben und versuchen, eine Abfrage auszugeben, die beide verwendet, erhalten Sie einen mehrdeutigen Feld-SQL-Fehler. das wird mit Aliases vermieden).

+0

Ich bekomme nicht das 'virtualFields von einem Modell zum anderen kopieren 'Teil. Wie würdest du das auf meine derzeitige Situation anwenden? Es scheint nicht zu funktionieren – user765368

+0

ok hab es, danke – user765368

+0

Scheint so, als hättest du es schon, aber du würdest sowas machen wie $ this-> MyOtherModel-> virtualFields ['full_name'] = $ this-> User-> virtualFields ['full_name'] 'vor der Ausgabe des Befehls 'find'. –

1

In Ihrem Modell müssen Sie folgenden Code virtuelles Feld erstellen mit:

public $virtualFields = array(
    'full_name' => 'CONCAT(YourModelName.first_name, " ", YourModelName.last_name)' 

);

Jetzt einfach benötigen Sie den Code unten in Ihrem Controller Zustand Array zu nennen:

$condition=array($this->YourModelName->virtualFields['your_virtual_field_name'].' LIKE "%'.$YourSearchKeyword.'%"');