2013-02-27 33 views
6

Tôi có một kiểu gọi là User có một số Virtual field được gọi là full_name. Khi tôi truy cập vào mô hình của tôi User trong một truy vấn tìm(), tôi có thể thiết lập các điều kiện trên sân ảo của tôi không có vấn đề như thế này:mô hình cakephp virtualFields không hoạt động qua chứa

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

Các truy vấn trên thành công sẽ trở lại cho tôi những dữ liệu cho người sử dụng gọi là Bruce Thomas. Nhưng vấn đề nảy sinh khi tôi cố gắng sử dụng mô hình tài khoản của mình thông qua mô hình khác thông qua các hành vi Containable như thế này:

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

(Ví dụ này trên giả định rằng MyOtherModel có một mối quan hệ belongsTo với mô hình của tôi MyOtherModel)

Các truy vấn ở trên cung cấp cho tôi lỗi sau:

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

Mọi trợ giúp về cách tôi có thể thực hiện việc này? Cảm ơn bạn

+0

Bạn có thể thêm/bộ 'Configure :: write ('debug', 2); 'trong "app/config/core.php "và thêm' element ('sql_dump'); ?> 'trong mã của bạn để kiểm tra truy vấn? –

+0

Bạn có thể sao chép các điều kiện kết quả không? –

Trả lời

10

Theo tài liệu CakePHP mới nhất (cho v2 trở lên), đó là một hạn chế của lĩnh vực ảo - 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']; 

hoặc

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

Xem thêm chi tiết tại đây : http://book.cakephp.org/2.0/en/models/virtual-fields.html - nếu bạn đang lập kế hoạch triển khai các tùy chọn mà họ đề xuất (trông khá ổn với tôi), bạn nên xem phần "Trường ảo và bí danh mẫu" tránh xung đột tên trường (tức là nếu bạn có một trường được gọi là full_name trong hai mô hình và thử phát hành truy vấn sử dụng cả hai, bạn sẽ nhận được một lỗi SQL trường mơ hồ; tránh được với bí danh).

+0

Tôi không nhận được 'copy virtualFields từ mô hình này sang phần khác'. Làm thế nào bạn sẽ áp dụng điều này cho tình hình hiện tại của tôi? Nó dường như không hoạt động – user765368

+0

ok đã nhận nó, cảm ơn bạn – user765368

+0

Có vẻ như bạn đã có nó, nhưng bạn sẽ làm một cái gì đó như '$ this-> MyOtherModel-> virtualFields ['full_name'] = $ this-> User-> virtualFields ['full_name'] 'trước khi phát hành lệnh 'find'. –

1

Trong mô hình của bạn, bạn phải tạo lĩnh vực ảo sử dụng mã dưới đây:

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

);

Bây giờ Bạn chỉ cần gọi vào mã bên dưới bên trong mảng điều kiện của điều khiển của bạn:

$condition=array($this->YourModelName->virtualFields['your_virtual_field_name'].' LIKE "%'.$YourSearchKeyword.'%"'); 
Các vấn đề liên quan