Đ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');
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
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