كيفية تضمين الجمعيات في Find () مع قائمة الميدان

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

  •  26-09-2019
  •  | 
  •  

سؤال

أرغب في تلقي بيانات النموذج عن طريق Find (All) ، ولكن يجب أن يحصل المستخدم على مجموعة مقيدة فقط من حقول الجدول. هذا سهل:

$ret = $this->find('all',array('fields'=>array(
    'Employee.id','Employee.address_id'
)));

لكن هذا النموذج (نموذج الموظفين) لديه أيضًا رابطة ينتمي:

var $belongsTo = array(
    'Address' => array(
        'className' => 'Address',
        'foreignKey' => 'address_id',
        'fields' => array('Address.full_name')
    )
);

انا اريد ال Address.full_name الحقل للظهور في بيانات الجلب الخاصة بي أيضًا. لكنه لا يعمل مع استدعاء Find () أعلاه ، ويرمي خطأ (خطأ SQL: 1054: عمود غير معروف 'address.full_name' في "قائمة الحقل") عند تجربة هذا:

'fields'=>array('Employee.id','Employee.address_id','Address.full_name')

أي شخص يعرف كيفية حل هذا؟

تعديل: لقد نسيت تمامًا هذا العنوان. full_name هو حقل افتراضي. بالنظر إلى SQL المنتجة من CakePhP ، من الواضح لماذا لا يعمل:

SELECT
    `Employee`.`id`, `Employee`.`address_id`, `Address`.`full_name`
FROM
    `employees` AS `Employee`
    LEFT JOIN `addresses` AS `Address`
        ON (`Employee`.`address_id` = `Address`.`id`)
WHERE 1 = 1

في نموذج العنوان ، يتم تعريف Full_Name على النحو التالي:

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

إذن ، والسؤال هو: هل هو خطأ في Cakephp لا يمكنه تضمين الحقول الافتراضية (النموذج الأجنبي) ضمن قائمة ميدانية موفرة للعثور على ()؟

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

المحلول

لسوء الحظ ، لا يمكنك استخدام الحقول الافتراضية بالطريقة التي ترغب في ذلك. من عند قيود الحقول الافتراضية في وثائق الكيك:

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

يبدو أنك ستضطر إلى استخدام السلوك القابل للاحتفال.

نصائح أخرى

أود استخدام السلوك القابل للاحتفال في هذه الحالة.

تأكد من أن لديك السلوك القابل للاحتفال المحملة في نموذج الموظف الخاص بك أولاً:

var $actsAs = array('Containable');

ثم ، عندما تحاول الحصول على بياناتك ، افعلها مثل هذا:

$params = array('fields' => array('Employee.id', 'Employee.address_id'), 
    'contain' => array('Address' => array('fields' => array('Address.full_name')));
$ret = $this->find('all', $params);

المزيد عن السلوك الذي يمكن احتواءه هنا: http://book.cakephp.org/view/1323/containable

خطأ SQL: 1054: عمود غير معروف 'address.full_name' في "قائمة الحقل")

يمنحك هذا الخطأ فكرة أن هناك شيئًا ما خاطئًا مع استدعاء اسم العمود الخاص بك (هل يمكن أن يكون fullname عوضا عن full_name) أو على الأرجح تعريف النموذج الخاص بك. ينتمي الموظف عنوانًا ولكن هل العنوان Hasone أو Havemany؟

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top