تعديل الحقول التي يمكن احتواءها المطلوبة في رد الاتصال قبل الولادة؟
سؤال
في تطبيق Cakephp 1.2.5 ، لديّ Profile
النموذج الذي ينتمي User
نموذج. نموذج المستخدم لديه ملف username
الحقل ، وعند أداء أ find()
في نموذج الملف الشخصي ، أريد دائمًا استرداد قيمة User.username
جدا. أعتقد أنه من المنطقي تعديل نموذج ملف التعريف الخاص بي beforeFind()
طريقة لاحتواء الحقل المطلوب تلقائيًا.
هذا ما حاولت القيام به:
public function beforeFind($queryData) {
// determine if the username data was already requested to be included in the return data via 'User.username' or 'User' => array('username').
$hasUserData = isset($queryData['contain']) && in_array("User.{$this->User->displayField}", $queryData['contain']);
$hasUserData |= isset($queryData['contain']['User']) && in_array($this->User->displayField, $queryData['contain']['User']);
// request the the username data be included if it hasn't already been requested by the calling method
if (!$hasUserData) {
$queryData['contain']['User'][] = $this->User->displayField;
}
return $queryData;
}
أستطيع أن أرى أن قيمة $queryData['contain']
يتم تحديثه بشكل صحيح ، لكن بيانات اسم المستخدم لم يتم استردادها. نظرت إلى رمز Cakephp الأساسي لـ find()
الطريقة ، ووجدت أن beforeFind()
يتم استدعاء رد الاتصال بعد عمليات الاسترجاعات الخاصة بجميع السلوكيات ، مما يعني أن الاحتراف قد فعل بالفعل ما تحتاج إلى فعله بقيمة $queryData['contain']
قبل أن أتمكن من تعديله.
كيف يمكنني العمل حول هذا دون اختراق النواة؟
المحلول
لقد قمت بحلها ، لذا ها هي إجابتي في حال كان لدى أي شخص نفس المضاعفات. لا يمكن تحديد حقول قابلة للاحتفال في مسبقًا منذ جميع السلوكيات beforeFind()
تسمى الطرق قبل إلى النموذج beforeFind()
طريقة.
على هذا النحو ، كان من الضروري بالنسبة لي تعديل find()
الطريقة مباشرة في نموذج الملف الشخصي من أجل إلحاق حقل احتواء مخصص.
public function find($conditions = null, $fields = array(), $order = null, $recursive = null) {
$this->contain("{$this->User->alias}.{$this->User->displayField}");
return parent::find($conditions, $fields, $order, $recursive);
}
نصائح أخرى
مات ، أعتقد أنه حل جميل. أنا أستخدم CakePhP 2.0.4 وكنت أعتزم جلب بيانات نموذج المستخدم فقط.
فقط للسجل ، إعداد Actsas لنموذج المستخدم
class User extends AppModel {
public $name = 'User';
public $belongsTo = array('Role');
public $actsAs = array('Containable');
...
ثم تجاوز طريقة البحث بهذه الطريقة:
public function find($conditions = null, $fields = array(), $order = null, $recursive = null) {
$this->contain();
return parent::find($conditions, $fields, $order, $recursive);
}
أو ، إذا كانت تعتزم إحضار بيانات الملف الشخصي ، على سبيل المثال:
public function find($conditions = null, $fields = array(), $order = null, $recursive = null) {
$this->contain(array('Profile'));
return parent::find($conditions, $fields, $order, $recursive);
}