2012-06-18 4 views
6

Tôi có một mô hình không chứa tiêu đề nào. Tất cả các thông tin thú vị là trong một mô hình liên quan.Sử dụng một trường từ mô hình có liên quan làm trường hiển thị của bạn trong CakePHP

Tôi đã đọc về virtualfields, mà bạn có thể kết hợp các lĩnh vực như thế này:

public $virtualFields = array("full_name"=>"CONCAT(event_id, ' ' ,begin)"); 
public $displayField = 'full_name'; 

Nhưng điều đó mang lại cho tôi với một id đơn giản và một ngày. Tôi cần id đó là tên từ mô hình khác.

Trả lời

6

Điều này thực sự giống như một công việc cho Set::combine(). Trường hiển thị của bạn không nên tham chiếu đến một mô hình khác, vì nó không phải lúc nào cũng được đảm bảo để tham gia. Vì vậy, nếu một cuộc gọi ở đâu đó không đưa dữ liệu vào, nó sẽ gây ra lỗi.

Thay vào đó, sử dụng Set::combine() bạn có thể tạo mảng khóa-giá trị với bất kỳ thứ gì bạn muốn. Mặc dù điều này ít "huyền diệu", điều này sẽ dẫn đến ít khả năng xảy ra lỗi hơn.

Ví dụ về UsersController, giả sử bạn có hasOne Profile và muốn người dùng chọn người dùng sử dụng trình đơn thả xuống tự động (ví dụ: sử dụng FormHelper) hiển thị tên đầy đủ của người dùng từ hồ sơ của họ. Chúng tôi sẽ sử dụng Containable để mang lại dữ liệu hồ sơ.

class AppModel extends Model { 
    $actsAs = array(
    'Containable' 
); 
} 

Sau đó, trong UsersController:

function choose($id = null) { 
    // regular view code here 
    $users = $this->User->find('all', array(
    'contain' => array(
     'Profile' 
    ) 
)); 
    // create a key-value that the FormHelper recognizes 
    $users = Set::combine($users , '{n}.User.id', '{n}.Profile.full_name'); 
} 

Bạn sẽ nhận thấy rằng full_name tại là trên mô hình hồ sơ, vì nó sử dụng các trường từ mô hình đó. Phương pháp kết hợp tạo ra một mảng như

array(
    1 => 'skerit', 
    2 => 'jeremy harris' 
); 

Mà sẽ tự động được sử dụng khi bạn sử dụng FormHelper để tạo ra một danh sách thả xuống

echo $this->Form->input('user_id'); 
+1

Thanks, điều này đã giúp tôi hiểu kết hợp(). Đừng quên bạn sẽ cần phải thêm có thể chứa trong ví dụ của bạn. – 472084

+0

Tuyệt vời, vui vì nó đã giúp ai đó. Tôi đã thêm có thể chứa vào ví dụ để làm cho câu trả lời hoàn chỉnh hơn. – jeremyharris