CakePhP: الحقول الافتراضية التي تحتوي على حقول البيانات ذات الصلة النموذجية

StackOverflow https://stackoverflow.com/questions/3831872

  •  26-09-2019
  •  | 
  •  

سؤال

لدي موظف نموذج ينتمي إلى نموذج عناوين. عندما أحضر البيانات من نموذج الموظفين ، يتم جلب سجل العنوان المرتبط أيضًا. بالإضافة إلى ذلك ، يحتوي نموذج العنوان على Full_Name Full_Name. هذا يبدو هكذا:

Array 
(
[0] => Array
       (
        [Employee] => Array
            (
                [id] => 1
                [address_id] => 33
                [username] => ...
                ...
            )

        [Address] => Array
            (
                [id] => 33
                [firstname] => Blah
                [full_name] => Blah Blubb
                ...
            )

    )

[1] => Array  (
        [Employee] => Array   (
                [id] => 2
                ...

أريد أن أدرج هذا الافتراضي في جزء الموظف من مجموعة البيانات أيضًا

Array (
[0] => Array (
        [Employee] => Array
            (
                [id] => 1
                [full_name] => Blah Blubb
                ...
            )

TIS غير ممكن حلها فقط إضافة

$virtualFields = array(
    'full_name' => 'CONCAT_WS(" ", Address.firstname, Address.surname)',
);

إلى نموذج الموظفين ، ككتاب الطبخ تنص على هناك حل مقترح ("نسخ VirtualFields من نموذج إلى آخر في وقت التشغيل عندما تحتاج إلى الوصول إليها") ، لكنني لا أفهم هذا الحل. أين يجب أن أضع هذا؟ في وحدة التحكم؟ في النموذج في وظيفة البحث؟

شكرا للمساعدة

هل كانت مفيدة؟

المحلول 2

أنا أفعل ذلك باليد الآن في وظيفة رد الاتصال على طراز Afterfind:

array_walk($results,function(&$a){
        if(isset($a['Address']['full_name'])) {
            $a['Employee']['full_name'] = $a['Address']['full_name'];
            unset($a['Address']);
        }
    });

قد لا يكون ذلك لطيفًا ، لكنه يعمل.

نصائح أخرى

http://book.cakephp.org/view/1608/virtual-fields#virtual-fields-and-model-aliases-1632

إن تنفيذ VirtualFields في 1.3 لديه بعض القيود. أولاً ، لا يمكنك استخدام VirtualFields على النماذج المرتبطة بالشروط أو الطلب أو الحقول. سيؤدي القيام بذلك بشكل عام إلى خطأ SQL حيث لا يتم استبدال الحقول بـ ORM. هذا لأنه من الصعب تقدير العمق الذي يمكن العثور عليه من النموذج المرتبط.

أضف ما يلي إلى النموذج الخاص بك:

public function __construct($id=false,$table=null,$ds=null){
    parent::__construct($id,$table,$ds);
    $this->virtualFields = array(
        'full_name'=>"CONCAT(`Address.firstname`,' ',`Address.surname`)"
    );
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top