2013-02-27 16 views
6

Mam model o nazwie User, który ma Virtual field o nazwie full_name. Kiedy dostęp do mojego modelu User w find() zapytania, mogę ustawić warunki na moim wirtualnym polu bez problemu tak:Modele cakephp virtualFields nie działa poprzez zawierają

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

Zapytanie powyżej powodzeniem wrócić mi dane dla użytkownika o nazwie Bruce Thomas. Ale problem pojawia się, gdy próbuję użyć mojego modelu użytkownika przez innego modelu poprzez mieszczące zachowania jak ten:

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

(Przykład powyżej zakłada, że ​​MyOtherModel ma belongsTo związek z moim modelu MyOtherModel)

The powyższe zapytanie daje mi następujący błąd:

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

Jakąkolwiek pomoc, jak mogę to zrobić, proszę? Dziękuję

+0

Możesz dodać/set 'Configure :: write ('debug', 2);' w „app/config/core.php "i dodaj' element ('sql_dump'); ?> 'w kodzie do sprawdzania zapytań? –

+0

Czy możesz skopiować wynik bez warunków? –

Odpowiedz

10

Według najnowszych dokumentacji CakePHP (dla v2 i więcej), że jest to ograniczenie pola wirtualnych - 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']; 

lub

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

Więcej szczegółów tutaj : http://book.cakephp.org/2.0/en/models/virtual-fields.html - jeśli planujesz wdrożyć sugerowane przeze mnie opcje (co wydaje mi się całkiem w porządku) powinieneś zajrzeć do sekcji "Wirtualne pola i aliasy modelu", aby unikaj konfliktów nazw pól (np. jeśli masz pole o nazwie full_name w dwóch modelach i wypróbuj zapytanie, które używa obu, otrzymasz niejednoznaczny błąd SQL w polu; można tego uniknąć za pomocą aliasów).

+0

Nie otrzymuję części 'copy virtualFields from one model to another' part. Jak zastosowałbyś to do mojej obecnej sytuacji? Wydaje się nie działać – user765368

+0

ok, dziękuję – user765368

+0

Wygląda na to, że już go masz, ale zrobiłbyś coś w rodzaju '$ this-> MyOtherModel-> virtualFields ['full_name'] = $ this-> User-> virtualFields ['full_name'] 'przed wydaniem polecenia 'find'. –

1

W modelu trzeba tworzyć wirtualne pole za pomocą poniższego kodu:

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

);

Teraz Wystarczy zadzwonić poniższy kod wewnątrz stan tablicy kontrolera za:

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